From 86e5480d92840957aeb72c30fbe4e60e1a0ba52c Mon Sep 17 00:00:00 2001 From: davidduet Date: Fri, 21 Oct 2022 16:28:27 +0800 Subject: [PATCH 1/6] feat(bonds): add discount bond --- packages/bonds/.env.example | 25 + packages/bonds/.npmignore | 3 + packages/bonds/.solcover.js | 3 + packages/bonds/.solhint.json | 28 + packages/bonds/.solhintignore | 2 + packages/bonds/README.md | 1 + packages/bonds/config.ts | 2 + .../contracts/AccidentHandler20220715V3.sol | 95 +++ packages/bonds/contracts/DiscountBond.sol | 59 ++ packages/bonds/contracts/mocks/MockERC20.sol | 30 + packages/bonds/data.json | 164 ++++++ .../userCompensation-0810-1909-filtered.csv | 103 ++++ packages/bonds/deploy/.defines.ts | 90 +++ packages/bonds/deploy/001_deploy-handler.ts | 158 +++++ packages/bonds/deployments/bsc/.chainId | 1 + .../.extraMeta/AccidentHandler20220715V3.json | 4 + .../bsc/AccidentHandler20220715V3.json | 540 ++++++++++++++++++ ...identHandler20220715V3_Implementation.json | 421 ++++++++++++++ .../bsc/AccidentHandler20220715V3_Proxy.json | 244 ++++++++ .../123cc147802b234c976c6c4db54070fc.json | 55 ++ .../41a8600e180880fe88609322a6b2ac21.json | 41 ++ packages/bonds/deployments/bsctest/.chainId | 1 + .../.extraMeta/AccidentHandler20220715V3.json | 4 + .../bsctest/AccidentHandler20220715V3.json | 527 +++++++++++++++++ ...identHandler20220715V3_Implementation.json | 408 +++++++++++++ .../AccidentHandler20220715V3_Proxy.json | 244 ++++++++ .../41a8600e180880fe88609322a6b2ac21.json | 41 ++ .../c64de78500c453458ed62a1018d284a7.json | 55 ++ packages/bonds/hardhat.config.ts | 207 +++++++ packages/bonds/package.json | 37 ++ packages/bonds/scripts/clean-solc-inputs.ts | 33 ++ packages/bonds/scripts/compensasion.ts | 7 + packages/bonds/scripts/tsconfig.json | 9 + packages/bonds/scripts/utils.ts | 69 +++ .../test/AccidentHandler20220715.test.ts | 75 +++ packages/bonds/tsconfig.json | 14 + packages/bonds/types/hardhat-deploy.ts | 34 ++ packages/bonds/types/openzeppelin.d.ts | 1 + 38 files changed, 3835 insertions(+) create mode 100644 packages/bonds/.env.example create mode 100644 packages/bonds/.npmignore create mode 100644 packages/bonds/.solcover.js create mode 100644 packages/bonds/.solhint.json create mode 100644 packages/bonds/.solhintignore create mode 100644 packages/bonds/README.md create mode 100644 packages/bonds/config.ts create mode 100644 packages/bonds/contracts/AccidentHandler20220715V3.sol create mode 100644 packages/bonds/contracts/DiscountBond.sol create mode 100644 packages/bonds/contracts/mocks/MockERC20.sol create mode 100644 packages/bonds/data.json create mode 100644 packages/bonds/data/userCompensation-0810-1909-filtered.csv create mode 100644 packages/bonds/deploy/.defines.ts create mode 100644 packages/bonds/deploy/001_deploy-handler.ts create mode 100644 packages/bonds/deployments/bsc/.chainId create mode 100644 packages/bonds/deployments/bsc/.extraMeta/AccidentHandler20220715V3.json create mode 100644 packages/bonds/deployments/bsc/AccidentHandler20220715V3.json create mode 100644 packages/bonds/deployments/bsc/AccidentHandler20220715V3_Implementation.json create mode 100644 packages/bonds/deployments/bsc/AccidentHandler20220715V3_Proxy.json create mode 100644 packages/bonds/deployments/bsc/solcInputs/123cc147802b234c976c6c4db54070fc.json create mode 100644 packages/bonds/deployments/bsc/solcInputs/41a8600e180880fe88609322a6b2ac21.json create mode 100644 packages/bonds/deployments/bsctest/.chainId create mode 100644 packages/bonds/deployments/bsctest/.extraMeta/AccidentHandler20220715V3.json create mode 100644 packages/bonds/deployments/bsctest/AccidentHandler20220715V3.json create mode 100644 packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Implementation.json create mode 100644 packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Proxy.json create mode 100644 packages/bonds/deployments/bsctest/solcInputs/41a8600e180880fe88609322a6b2ac21.json create mode 100644 packages/bonds/deployments/bsctest/solcInputs/c64de78500c453458ed62a1018d284a7.json create mode 100644 packages/bonds/hardhat.config.ts create mode 100644 packages/bonds/package.json create mode 100644 packages/bonds/scripts/clean-solc-inputs.ts create mode 100644 packages/bonds/scripts/compensasion.ts create mode 100644 packages/bonds/scripts/tsconfig.json create mode 100644 packages/bonds/scripts/utils.ts create mode 100644 packages/bonds/test/AccidentHandler20220715.test.ts create mode 100644 packages/bonds/tsconfig.json create mode 100644 packages/bonds/types/hardhat-deploy.ts create mode 100644 packages/bonds/types/openzeppelin.d.ts diff --git a/packages/bonds/.env.example b/packages/bonds/.env.example new file mode 100644 index 0000000..2acdc84 --- /dev/null +++ b/packages/bonds/.env.example @@ -0,0 +1,25 @@ +# etherscan family keys +ETHERSCAN_API_KEY=ABC123ABC123ABC123ABC123ABC123ABC1 +BSCSCAN_TEST_KEY=ABC123ABC123ABC123ABC123ABC123ABC1 + +# coinmarketcap api key +COIN_MARKETCAP_API_KEY=ABCDE000-0000-0000-0000-000000000 + +# private key for deployment +KEY_BSC_TEST=abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1 +KEY_BSC_MAINNET=abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1 + +REPORT_GAS=true + +# fork from morails +FORK_ENABLED=on +FORK_URL=https://speedy-nodes-nyc.moralis.io/xxxxx/bsc/testnet/archive +FORK_BLOCK_NUMBER=123456 +FORK_CHAIN_ID=97 +FORK_KEY=private key + +# client sdk publishing +AWS_ACCESS_KEY_ID= [KEY_ID] +AWS_SECRET_ACCESS_KEY= [ACCESS_KEY] +AWS_S3_BUCKET=duet-node-modules +AWS_REGION=us-east-1 diff --git a/packages/bonds/.npmignore b/packages/bonds/.npmignore new file mode 100644 index 0000000..dc03781 --- /dev/null +++ b/packages/bonds/.npmignore @@ -0,0 +1,3 @@ +hardhat.config.ts +scripts +test diff --git a/packages/bonds/.solcover.js b/packages/bonds/.solcover.js new file mode 100644 index 0000000..deb57cb --- /dev/null +++ b/packages/bonds/.solcover.js @@ -0,0 +1,3 @@ +module.exports = { + skipFiles: ['contracts/mocks/*'], +} diff --git a/packages/bonds/.solhint.json b/packages/bonds/.solhint.json new file mode 100644 index 0000000..0f6777d --- /dev/null +++ b/packages/bonds/.solhint.json @@ -0,0 +1,28 @@ +{ + "extends": "solhint:recommended", + "plugins": [ + "prettier" + ], + "rules": { + "prettier/prettier": "warn", + "not-rely-on-time": [ + "off" + ], + "compiler-version": [ + "error", + "^0.8.9" + ], + "no-inline-assembly": [ + "off" + ], + "func-visibility": [ + "warn", + { + "ignoreConstructors": true + } + ], + "mark-callable-contracts": [ + "off" + ] + } +} diff --git a/packages/bonds/.solhintignore b/packages/bonds/.solhintignore new file mode 100644 index 0000000..46ee001 --- /dev/null +++ b/packages/bonds/.solhintignore @@ -0,0 +1,2 @@ +node_modules +contracts/mocks diff --git a/packages/bonds/README.md b/packages/bonds/README.md new file mode 100644 index 0000000..43e8458 --- /dev/null +++ b/packages/bonds/README.md @@ -0,0 +1 @@ +# for Accident at 2022-07-15 diff --git a/packages/bonds/config.ts b/packages/bonds/config.ts new file mode 100644 index 0000000..7a6fcd3 --- /dev/null +++ b/packages/bonds/config.ts @@ -0,0 +1,2 @@ +import config from '@private/shared/config' +export default config diff --git a/packages/bonds/contracts/AccidentHandler20220715V3.sol b/packages/bonds/contracts/AccidentHandler20220715V3.sol new file mode 100644 index 0000000..93d98e5 --- /dev/null +++ b/packages/bonds/contracts/AccidentHandler20220715V3.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.9; +pragma abicoder v2; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; + +import "@private/shared/libs/Adminable.sol"; + +contract AccidentHandler20220715V3 is Initializable, Adminable { + using SafeERC20Upgradeable for IERC20Upgradeable; + + // [user]: [token]: amount # retrievable + mapping(address => mapping(address => uint256)) public userRetrievableTokenMap; + // [user]: [token]: amount # retrieved + mapping(address => mapping(address => uint256)) public userRetrievedTokenMap; + // [token]: amount # retrievable + mapping(address => uint256) public remainTokenMap; + + uint256 public endingAt; + + event Retrieve(address user, address token, uint256 amount); + + struct Record { + address user; + address token; + uint256 amount; + } + + function initialize(address admin_, uint256 endingAt_) public initializer { + require(admin_ != address(0), "Can't set admin to zero address"); + _setAdmin(admin_); + setEndingAt(endingAt_); + } + + function retrievables(address[] calldata tokens) external view returns (uint256[] memory) { + uint256[] memory amounts = new uint256[](tokens.length); + for (uint256 i; i < tokens.length; i++) { + amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]]; + } + return amounts; + } + + function retrieved(address[] calldata tokens) external view returns (uint256[] memory) { + uint256[] memory amounts = new uint256[](tokens.length); + for (uint256 i; i < tokens.length; i++) { + amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]]; + } + return amounts; + } + + function setRecords(Record[] calldata records_) external onlyAdmin { + for (uint256 i; i < records_.length; i++) { + Record calldata record = records_[i]; + if (record.amount <= 0) { + continue; + } + require( + userRetrievableTokenMap[record.user][record.token] == 0 && + userRetrievedTokenMap[record.user][record.token] == 0, + string(abi.encodePacked("Can not set twice for user", record.user, ", token:", record.token)) + ); + userRetrievableTokenMap[record.user][record.token] += record.amount; + remainTokenMap[record.token] += record.amount; + } + } + + function setEndingAt(uint256 endingAt_) public onlyAdmin { + require(endingAt_ > 0, "Invalid ending time"); + endingAt = endingAt_; + } + + function retrieveTokens(address[] calldata tokens) external { + require(endingAt > block.timestamp, "Out of window"); + for (uint256 i; i < tokens.length; i++) { + IERC20Upgradeable token = IERC20Upgradeable(tokens[i]); + uint256 amount = userRetrievableTokenMap[msg.sender][tokens[i]]; + if (amount > 0) { + delete userRetrievableTokenMap[msg.sender][tokens[i]]; + userRetrievedTokenMap[msg.sender][tokens[i]] += amount; + remainTokenMap[tokens[i]] -= amount; + token.safeTransfer(msg.sender, amount); + emit Retrieve(msg.sender, tokens[i], amount); + } + } + } + + function transferTokens(IERC20Upgradeable[] calldata tokens_) public onlyAdmin { + for (uint256 i = 0; i < tokens_.length; i++) { + IERC20Upgradeable token = tokens_[i]; + token.safeTransfer(msg.sender, token.balanceOf(address(this))); + } + } +} diff --git a/packages/bonds/contracts/DiscountBond.sol b/packages/bonds/contracts/DiscountBond.sol new file mode 100644 index 0000000..a9f401c --- /dev/null +++ b/packages/bonds/contracts/DiscountBond.sol @@ -0,0 +1,59 @@ +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +contract DiscountBond is ERC20 { + using SafeERC20 for IERC20; + address public factory; + IERC20 immutable underlyingToken; + uint256 public price; + uint256 immutable maturity; + uint256 constant priceDecimals = 1e8; + + constructor( + string memory name_, + string memory symbol_, + address factory_, + IERC20 underlyingToken_, + uint256 maturity_ + ) ERC20(name_, symbol_) { + underlyingToken = underlyingToken_; + factory = factory_; + maturity = maturity_; + } + + modifier beforeMaturity() { + require(block.timestamp < maturity, "Can not do this at maturity"); + _; + } + + function setPrice(uint256 price_) external beforeMaturity { + price = price_; + } + + function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_) beforeMaturity { + underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_); + uint256 bondAmount = (underlyingAmount_ * priceDecimals) / price; + _mint(account_, bondAmount); + } + + function mintByAmount(address account_, uint256 bondAmount_) external beforeMaturity { + uint256 underlyingAmount = (bondAmount_ * price) / priceDecimals; + underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount); + _mint(account_, bondAmount_); + } + + function sellFor(address account_, uint256 bondAmount_) public beforeMaturity { + _burn(); + } + + function redeem(uint256 bondAmount_) public { + redeemFor(msg.sender, bondAmount_); + } + + function redeemFor(address account_, uint256 bondAmount_) public { + require(balanceOf(msg.sender) >= bondAmount_, "DiscountBond: redeem amount exceeds balance"); + _burn(msg.sender, bondAmount_); + underlyingToken.safeTransfer(account_, bondAmount_); + } +} diff --git a/packages/bonds/contracts/mocks/MockERC20.sol b/packages/bonds/contracts/mocks/MockERC20.sol new file mode 100644 index 0000000..595fe29 --- /dev/null +++ b/packages/bonds/contracts/mocks/MockERC20.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.9; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract MockERC20 is ERC20 { + uint8 private _decimals; + + constructor( + string memory name, + string memory symbol, + uint256 supply, + uint8 decimals_ + ) ERC20(name, symbol) { + _mint(msg.sender, supply); + _decimals = decimals_; + } + + function mintTokens(uint256 _amount) external { + _mint(msg.sender, _amount); + } + + function mint(address to_, uint256 _amount) external { + _mint(to_, _amount); + } + + function decimals() public view virtual override returns (uint8) { + return _decimals; + } +} diff --git a/packages/bonds/data.json b/packages/bonds/data.json new file mode 100644 index 0000000..e2816ef --- /dev/null +++ b/packages/bonds/data.json @@ -0,0 +1,164 @@ +[ + ["0xe078b6dfac68b9282c16777a78f2680f1dc5cd86", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1c7232ca30430068"], + ["0xe078b6dfac68b9282c16777a78f2680f1dc5cd86", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x21ca9d00320f"], + ["0xc13cad139d0a54bb496cb05be126fcbff785aeae", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x073985ceb1459f5ba2"], + ["0xc13cad139d0a54bb496cb05be126fcbff785aeae", "0xc21534dfc450977500648732f49b9b186bcb1386", "0x4a3c27aedd7426a2"], + ["0x51f2d3fdfc459363bf7a1ac2c378b882de918c1b", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x318e7f63bb26"], + ["0xb58c189fad07daf826542ac9f3a3c3a2c5ac4a75", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xa88fad891249990a7a"], + ["0xb58c189fad07daf826542ac9f3a3c3a2c5ac4a75", "0xbdb2fbe2b635ee689e916e490673b0a8b9eb687b", "0x54ab54e304e6cae36a"], + ["0xe7afc1509ea558a1ea3a25e6f26ee018d23ec878", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x2df6ab274de6"], + ["0x4ba13102569af816bc3cfbad0c95d478fa3df58c", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x26a11f3b3e39c94b"], + ["0x3cccc8ffbac4aaa5b97899f823ffdae9ad0cd4b6", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x088f0d640976"], + ["0x5bd8d53af7cd96af62589b06798a8e4216d4d7e8", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x12e5fb4041cd"], + ["0x55fd2a393793cdb546fe0ab1fdc37df8f61520f4", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x8cac1ec2e53e363b"], + ["0x6728a80cf45eebe656fbd5b3d3820a9a05f78c98", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x15abcc056278d3ca"], + ["0xb22b1187beacfda3fe2a414d0bcb65c2c2d3012e", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x4fd4f1d35c"], + ["0xd7f4a04c736cc1c5857231417e6cb8da9cadbec7", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x49aadd2ead90"], + ["0x6a4376a31623db641aa21f1e5cd63da526657b89", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x2c3ab3e807db5d1f"], + ["0x95ff5b7681aa91d8d9a565b2e983b054d4f922cb", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x2a6596fbc5b2"], + ["0x14f4f859281e3f941d5194c1938bbab1290e7dcf", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1cde3d1a3f0fa00aa2"], + ["0x1b0466be45419bc3af1a1d73eac3c80d7b88b2dc", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x987555b2e2dd78"], + ["0xaa8bdb60ee28e7616bfe4867f58bfe4edf858271", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x1eb7977fea95052e"], + ["0x24f850a2addf409d34f171e56b7e7d74fdac2a0f", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x11f7735759bb"], + ["0x3a887cf29012fb8ab4ee196a3eaccdaf57946fa8", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x05c33efbbde6017dcc"], + ["0xf0419ee1156cc75fc0dbaa1906f85782430a5f6e", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x9a50afe7d4b8caf8"], + ["0xf0419ee1156cc75fc0dbaa1906f85782430a5f6e", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x14fca92f2f551aac"], + ["0xc11b02bba83ba5554855ee58f80952b38dafa383", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x0da25b11546897f9"], + ["0xc11b02bba83ba5554855ee58f80952b38dafa383", "0xc21534dfc450977500648732f49b9b186bcb1386", "0x018b55f5e05cb84d"], + ["0xc11b02bba83ba5554855ee58f80952b38dafa383", "0xbdb2fbe2b635ee689e916e490673b0a8b9eb687b", "0x0ee54a1f1c5ea938"], + ["0xc11b02bba83ba5554855ee58f80952b38dafa383", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x0d55cb6fedc374cd69"], + ["0x5275817b74021e97c980e95ede6bbac0d0d6f3a2", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1b32048e252f039571"], + ["0x5275817b74021e97c980e95ede6bbac0d0d6f3a2", "0xc21534dfc450977500648732f49b9b186bcb1386", "0x10ce7febaca86000"], + ["0x5275817b74021e97c980e95ede6bbac0d0d6f3a2", "0xbdb2fbe2b635ee689e916e490673b0a8b9eb687b", "0x2ca7bf080855e800"], + ["0x42810ba75fd56a4052209fc42d5a93174abd66b1", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x1a7c0dce2658"], + ["0x94be0b9124ae7c111b9c02871100e62c37c14a69", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x12890c72cd45"], + ["0x5dfff0ba7b0f0c8431aba53ac1278c3accc8d6c6", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x2548dba550b8"], + ["0x1eec3865fd3015b0ce4b7ab55ed948f80df07ee9", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x0116a26ebb9e"], + ["0xf5f70962a33e046c08fc4c8a852b6cd79f4cc182", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x076dc69d752c"], + ["0xe35e49532b4067d514d76ca769b984e844b1e031", "0xbdb2fbe2b635ee689e916e490673b0a8b9eb687b", "0x021e42ee4a4b2865"], + ["0xaf30e7504eec4e46af6bf4018f8c9f7ce9e9ba8c", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x15b1cb46601f33d1"], + ["0xaf30e7504eec4e46af6bf4018f8c9f7ce9e9ba8c", "0xc21534dfc450977500648732f49b9b186bcb1386", "0x05a530ed63059232"], + ["0xaf30e7504eec4e46af6bf4018f8c9f7ce9e9ba8c", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x1e3d7a98e08f"], + ["0x2418c7ff88f10b461566a65d5563c22aba85ab2b", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x0f1e0bf0f0fea2a1"], + ["0xce7d5ee041a40e9f724f7d3b74e99d8fc1f0f696", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x1d7a3091b961"], + ["0x49c8c7b892f82eedc98551ccb69745005a2fd079", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0e9da57d7f78c5be80"], + ["0x49c8c7b892f82eedc98551ccb69745005a2fd079", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x02c0f84413ea46a0"], + ["0x49c8c7b892f82eedc98551ccb69745005a2fd079", "0xc21534dfc450977500648732f49b9b186bcb1386", "0xa18af868e8e4e8"], + ["0x49c8c7b892f82eedc98551ccb69745005a2fd079", "0xbdb2fbe2b635ee689e916e490673b0a8b9eb687b", "0x129288d3887b706c"], + ["0xa53c541d155c06a6fc0b0d42ea26ad7414cf547b", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1994d4adad66a1db"], + ["0xa53c541d155c06a6fc0b0d42ea26ad7414cf547b", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x18fb3902c4f7ff3e"], + ["0x13b91b3ff58886ace7637e547c53bbc2936d803f", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0e7d00dc292c9590"], + ["0x7e497d71fc537a0d859211cbef7cca2fa648f8c1", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x057282fe2c976c8c"], + ["0xd047b39824107d23116b544e1127fc0d3b131509", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x04da70ac5b19f4b358"], + ["0xd047b39824107d23116b544e1127fc0d3b131509", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x0aa7079ecde43121"], + ["0xd047b39824107d23116b544e1127fc0d3b131509", "0xbdb2fbe2b635ee689e916e490673b0a8b9eb687b", "0x0a74ce8198a214c5"], + ["0xd047b39824107d23116b544e1127fc0d3b131509", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x020b852d655d6adfc7"], + ["0xd9d3dd56936f90ea4c7677f554dfefd45ef6df0f", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x6b306a16317ab0cdc3"], + ["0xd9d3dd56936f90ea4c7677f554dfefd45ef6df0f", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x0d68bacecd9f1be9af"], + ["0xd9d3dd56936f90ea4c7677f554dfefd45ef6df0f", "0xc21534dfc450977500648732f49b9b186bcb1386", "0x04198e8771f87a9830"], + ["0x70edf363c1682b806cd58eaa4c45d7adb6f721f9", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x01b1b66e894321d000"], + ["0x70edf363c1682b806cd58eaa4c45d7adb6f721f9", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x0f416b7ee965"], + ["0x4475d1be974301106036061898b26fd5d62dbf5c", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x1af6343808c6a475"], + ["0x3b410f92ccdfad18477c9b4f325cec96d9dd397f", "0xc21534dfc450977500648732f49b9b186bcb1386", "0x07bd64d9080a7d87"], + ["0xec04eaefdd9a514964f136bd3e02398ec62ecc24", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x0332170f8c7263d2"], + ["0xf82ca9d627b15336de5f88dea0a338cd283188a0", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x352e8c13c7fa1c97d1"], + ["0xebcca48f3eb0a058b4540ef802d598e1406008ef", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x090dbace0bda"], + ["0x77f75363faeaae05aa54aae33e19a0c901147c11", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x1768ac6455bc623f"], + ["0x11b2e2b4a8f5f7fd59229a1b3d86eb7aaab15f82", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x165cb2564195"], + ["0x7f317b488fd3346a377ef178fde494aa59b044f7", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x05bff33bb0e7b62fd7"], + ["0x9d52de02cdc6eac4245b5a838b6e776fe1f1d312", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x72d86907e881d9f0"], + ["0x4dc810b632409bcbd2b7f8b5ace94279bc68cdd5", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x107eacd9130eb000"], + ["0x7977b909d55a53f9c73140f7f611eaf0638238ed", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1201fc815109f000"], + ["0xca3ab843b1c0665816b45cee77b3a0c1c3338c98", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0564d702d38f5e0000"], + ["0x8f1421db7c4dfd995e3b2209b754a22d8cc5a35e", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x43de8bd6ca0c4000"], + ["0xbd938b6b6f83e5535c649e921bc9d6151e86c100", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x10531f717f386800"], + ["0x45aecad3551f5c628e07a2a2b190bce2229fde5a", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x60a8a6990c988000"], + ["0x9ce6e6b60c894d1df9bc3d9d6cc969b79fb176b7", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x116f24e650dfc313"], + ["0xa7eef766b1f3f3d31a0c7c6ebd0b3f31e9a87634", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1302e6e06fc5e3c4"], + ["0x643777228acf1198d5e1a595dc12911955182376", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x420391ac26848fff"], + ["0x0818b8938fcd0a253ccdede9ec417277d3ca11e3", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x295ed12e43ada000"], + ["0x77c2da8140693996be6bc72776cb1f04a77a4e68", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x12484b0aa6a4ed20"], + ["0xe53f8cc868dc2e0fb1da5bd1b5e6404600a6de22", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x15824cbdd67e4000"], + ["0xf19c6fe6eb173f2c1c19c47a4e87ba2bba570a08", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1b9de674df070000"], + ["0x593bb3859dd0d244e94e233745a2542c732e1fe3", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x886ef0cd089f7000"], + ["0x8f918a9e919cc28c12169a9f4a36ac2fbeb89c42", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x2fddf7f00bed9800"], + ["0x9c299fa124bdfec5e5fdbb2cf480ac7d914691c6", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0e929719c1137000"], + ["0x5915ee060ec503cee03b4e81490cc424868d799f", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1d26fc969b8e4000"], + ["0xad382901be4c94467fefbf32e0764cd977b67344", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x8a1580485b230000"], + ["0x0000000000000000000000000000000000000000", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x03e8"], + ["0x0000000000000000000000000000000000000000", "0xc21534dfc450977500648732f49b9b186bcb1386", "0x03e8"], + ["0x0000000000000000000000000000000000000000", "0xbdb2fbe2b635ee689e916e490673b0a8b9eb687b", "0x03e8"], + ["0x0000000000000000000000000000000000000000", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x0233"], + ["0xb1f5dd6746151c73047838694c04b31494511c2c", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x56bcb618ae1cd000"], + ["0x52ff0010d4058bb726725ad76f542c53033d67a1", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x8a80151faa660000"], + ["0x8ec1c09522758be634a6d9f0e3661c8b1f91a5e4", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x18fae27693b40000"], + ["0x79db77b84a811ced34651dce941dfb707a8b9e8b", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1d7b18e0189cf000"], + ["0xd6e65d0a291115fb7319f73c49c1b703d252a7c0", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x02b5e3af16b1880000"], + ["0x65bc72f5e5daefe930f1b468fc73ec96b0228956", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0115002a3f54cc0000"], + ["0xb6ebe9453a42315a54e3184cd59b70a4924c1064", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0f3c2b489a6c8000"], + ["0x29d60a12b00b1f7ebe1f67c82a832ec6d2727439", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1bb3376cbbae0000"], + ["0xbf3cd4e28ced7f61c588693c018f4f38b4b0444e", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xa1ab06db4807e000"], + ["0x872c9926d1ba0794a637c23ecb45bb590273d6d3", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0fdd23c2cd7b2000"], + ["0x627e46f5922b5601ada533cb229c519103537c28", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x8a80151faa660000"], + ["0xacdceb490c614fa827c4f20710ee38e6b27d0eb2", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x8e56374bc7f9e000"], + ["0xc0ec851c663f97399cc749ebe798c9153b0dbb4b", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x98a81bee436fc000"], + ["0x014127e127c6788badae75ba213a58ac22944c82", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x05cb3b250ba15c729a"], + ["0xc04a3df04fe48c261a233e46110b0fdadab1733e", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x02de266940cd761000"], + ["0x11ededebf63bef0ea2d2d071bdf88f71543ec6fb", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x01cde5764a4479a900"], + ["0xbed58e0dcbc4b4ac0a9fce1d2f2804fbb6fe49aa", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x013acd3191b44cb000"], + ["0x67735e8032e1d191a5cfd55c0e117fd045a7508e", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x415888c74dbdb000"], + ["0x6d8b62e180c841e721a61f6003b148a76f246cec", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0fc9a38b664f1000"], + ["0xde7f1f6863022e4f34bc490871634404805b9825", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x3635c9adc5dea00000"], + ["0xd1c442e9e2de99d95036bb13ec07c94c6fb8fc03", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0de0b6b3a7640000"], + ["0x613d6139eac603587eb97638993692a78aa9c447", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xeafd3f790727ed39ab"], + ["0x336e51fb571c70066b640f5f9f713fe498ee0270", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x3635c9adc5dea00000"], + ["0x2e9c8f5f6ab9c393de71654f86369c204acdb468", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x3635c9adc5dea00000"], + ["0xa4ecc512292915fc56a0ba8eafb59ec1c0e2207d", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x3635c9adc5dea00000"], + ["0x7e23f27ae1b4179528a7c293a47742ff3555be5b", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x6c6b935b8bbd400000"], + ["0xeda9315946227c399a08ed87654eb2dab0e5bdd6", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x209f8f9601071dfb5b"], + ["0x6dbebd8fa691124e48829de1805be681920fbadf", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x225b6859663cb84c97"], + ["0xbf9b490af060529a7f89d155b3d045b896bb646e", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1b1ae4d6e2ef500000"], + ["0x0caa024c16777037b14c9a8a9dbe5f0ea31b2e95", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x020a50d4abd417b23a"], + ["0x97c15ca4d1d8bfbd796104d14d4a67892d67183e", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0148d83eb7c1d60a73"], + ["0x4b80ef7c6d4c4cdbe28029852ebaf1b88ad2b35d", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x17f7789ec07752d7db"], + ["0xc5436a0aa7a39f679aad99fffe3392c0990f70ed", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x16723aac5cd8e074"], + ["0x96451702bfe9ec3c5718402c99e69ed5776c4b37", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x57617381f02833e0"], + ["0xe03311b4590f5516739bf4c5197bcdbbbfc9d7e0", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x14f9d2ddcb4df000"], + ["0x1a88725b547336017efdf64b716b4c64374ef8e3", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x05a39dcb1a6c49140b"], + ["0xb5a48798d829b3389df6bd39189ba46128967bf2", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1bb32bee69c502f6"], + ["0xe5872996ab41dfd1220b34f083751953e7f5ddca", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xbf3f52cd7da2b9b6c7"], + ["0xa1af5309ee209886f1887b1de27097ad3768447a", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xf485fd8984508b10bc"], + ["0x0ed943ce24baebf257488771759f9bf482c39706", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xa69b5b1ef5df208c"], + ["0x0ed943ce24baebf257488771759f9bf482c39706", "0xf8f890e40a5f8d2455a5d7a007dd2170c1a72dd1", "0x029ea79b855949f2"], + ["0x0ed943ce24baebf257488771759f9bf482c39706", "0xc21534dfc450977500648732f49b9b186bcb1386", "0x4678cc1ba3be13"], + ["0x0ed943ce24baebf257488771759f9bf482c39706", "0xbdb2fbe2b635ee689e916e490673b0a8b9eb687b", "0x0234a6d4e198fb6e"], + ["0x0ed943ce24baebf257488771759f9bf482c39706", "0xbdf0aa1d1985caa357a6ac6661d838da8691c569", "0x42bda64b9278ebf4"], + ["0x89507b07d5d2ae1d5402afd964aad5df321c5ec1", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x323de8eabc9c59e1"], + [ + "0x19da3adb9c3a901c4850b632b6e1cab2dae14ea0", + "0x0b7b53a3c0E8620a170f7228685ad4686F440406", + "0x01c819b5e93c99a677fe" + ], + [ + "0xbc7c6d283a6cae98480415c01b554c1249b8a052", + "0x0b7b53a3c0E8620a170f7228685ad4686F440406", + "0x022e0e3a6224e908d600" + ], + ["0x2405189aaf2f3ea50b45c8f3d1fe8bfe12f04004", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x03215b5eb10f89a3b3"], + ["0x2d0c7a0807a21615fb945dd64afde7861dfb9c43", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0598fa6b3775bc0177"], + ["0x4b564101ccf16e94c1e304708650807e06a39bdc", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x459ec3fb40785b18"], + ["0x5df89e500d14fbdc01ca39af9e76e76bc46c7a09", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x340d2f072eb437b44d"], + ["0x691d6724e2e956457632b5072b2f0ee826ae0b61", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0261e1ebe2ac45fbb7"], + ["0x73234a37e49902136eb5318804f195b78cfdea34", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0570674fa109671de3"], + ["0x93f5043925c4d2a28628330820925fe0a82d2b24", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x0ae0ce9f4212ce3bc6"], + ["0x9c2fa2cddea1c0a612049728d4af9ba20fe58630", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xf1de6d1f77eda92e"], + ["0xa2e2c0ef708ecdeebf7da840f2b38389d19803db", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x1e26f6ee204b64b8d8"], + ["0xa4036d9c5d1c5edb323cedc88699e8241a3773bd", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x017dd8e0f1433a945a"], + ["0xa98d587471b48518163d3d2268ef4ed42cd69614", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x019170eaf626f73307"], + ["0xb5ee4f9dfcab6198dee8b013a74c951a44b8d78d", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x8b3d87f680f0b630"], + ["0xbdb4cb303a4e288110d57e9b25ad96242b5f1b9d", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xaee0a5f95b65dc76"], + ["0xd161099739c555b6d3d5e565cd55c470ee430f0e", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xe8c77c69e5f7ab8a"], + ["0xd89c07d7abbf83e4bac5907567c8cc1b32491450", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0xb21a32e6f36ac7dc"], + ["0xf43f5be06615a0303c8cff19e38cc1fe0f0ebbc3", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x013b024f933af63810"], + ["0xf4ce1da492110616024d401f8c659ff395851726", "0x0b7b53a3c0E8620a170f7228685ad4686F440406", "0x785ed9465a15cde9"] +] diff --git a/packages/bonds/data/userCompensation-0810-1909-filtered.csv b/packages/bonds/data/userCompensation-0810-1909-filtered.csv new file mode 100644 index 0000000..e6afe36 --- /dev/null +++ b/packages/bonds/data/userCompensation-0810-1909-filtered.csv @@ -0,0 +1,103 @@ +Account,BUSD_0xe9e7cea3dedca5984780bafc599bd69add087d56,dWTI-BUSD_0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d,dXAU-BUSD_0x95ca57ff396864c25520bc97deaae978daaf73f3,dTMC-BUSD_0xf048897b35963aaed1a241512d26540c7ec42a60,dUSD-BUSD-to-BUSD,dUSD-BUSD-vault-to-BUSD,DUET-dUSD-to-DUET-CAKE_0xbdf0aa1d1985caa357a6ac6661d838da8691c569,DUET-dUSD-vault-to-DUET-CAKE +0xc11b02bba83ba5554855ee58f80952b38dafa383,0.0,0.982447798708902000,0.111277130320230000,1.07334558367814000,0.0,0.0,245.989830938697000000,0.0 +0xd047b39824107d23116b544e1127fc0d3b131509,89.527246499775600000,0.767590640130470000,0.0,0.753454093684577000,26.265440011544100000,0.0,37.723607767121100000,0.0 +0xd7f4a04c736cc1c5857231417e6cb8da9cadbec7,0.0,0.0,0.0,0.0,0.0,0.0,0.000080998204091792,0.021876775641185300 +0x51f2d3fdfc459363bf7a1ac2c378b882de918c1b,0.0,0.0,0.0,0.0,0.0,0.0,0.000054488092359462,0.0 +0xe7afc1509ea558a1ea3a25e6f26ee018d23ec878,0.0,0.0,0.0,0.0,0.0,0.0,0.000050537456684518,0.0 +0x95ff5b7681aa91d8d9a565b2e983b054d4f922cb,0.0,0.0,0.0,0.0,0.0,0.0,0.000046615813146034,0.0 +0x5dfff0ba7b0f0c8431aba53ac1278c3accc8d6c6,0.0,0.0,0.0,0.0,0.000123089702202099,50.195595620649300000,0.000040994852917432,25.822207021319200000 +0xe078b6dfac68b9282c16777a78f2680f1dc5cd86,2.049756624381480000,0.0,0.0,0.0,0.0,0.0,0.000037154101146127,773.591824145136000000 +0xaf30e7504eec4e46af6bf4018f8c9f7ce9e9ba8c,0.0,1.563254048795080000,0.40678513747359000,0.0,0.0,0.0,0.000033249398677647,114.002772261652000000 +0xce7d5ee041a40e9f724f7d3b74e99d8fc1f0f696,0.0,0.0,0.0,0.0,0.0,0.0,0.000032410638072161,0.0 +0x42810ba75fd56a4052209fc42d5a93174abd66b1,0.0,0.0,0.0,0.0,0.0,0.0,0.00002912010988092,161.35150649666900000 +0x11b2e2b4a8f5f7fd59229a1b3d86eb7aaab15f82,0.0,0.0,0.0,0.0,0.0,0.0,0.000024587384799637,330.40065736720200000 +0x5bd8d53af7cd96af62589b06798a8e4216d4d7e8,0.0,0.0,0.0,0.0,0.0,2131.515461145940000000,0.000020778972103117,200.967221737110000000 +0x94be0b9124ae7c111b9c02871100e62c37c14a69,0.0,0.0,0.0,0.0,0.0,0.0,0.000020379828669765,0.0 +0x24f850a2addf409d34f171e56b7e7d74fdac2a0f,0.0,0.0,0.0,0.0,0.0,0.0,0.000019754489698747,215.513022200803000000 +0x70edf363c1682b806cd58eaa4c45d7adb6f721f9,31.2522882,0.0,0.0,0.0,0.0,0.0,0.000016773650770277,232.222537265606000000 +0xebcca48f3eb0a058b4540ef802d598e1406008ef,0.0,0.0,0.0,0.0,0.0,0.0,0.000009954573290458,0.0 +0x3cccc8ffbac4aaa5b97899f823ffdae9ad0cd4b6,0.0,0.0,0.0,0.0,0.0,0.0,0.000009410498005366,0.0 +0xf5f70962a33e046c08fc4c8a852b6cd79f4cc182,0.0,0.0,0.0,0.0,0.0,0.0,0.000008168065037612,0.0 +0x1eec3865fd3015b0ce4b7ab55ed948f80df07ee9,0.0,0.0,0.0,0.0,0.0,0.0,0.00000119672607427,0.0 +0x5275817b74021e97c980e95ede6bbac0d0d6f3a2,501.666251882315000000,0.0,1.211046,3.2177505,0.0,3293.555099735680000000,0.0,0.0 +0xe35e49532b4067d514d76ca769b984e844b1e031,0.0,0.0,0.0,0.152633028593265000,0.0,0.0,0.0,0.0 +0xd9d3dd56936f90ea4c7677f554dfefd45ef6df0f,1977.290241150040000000,247.354244466370000000,75.628534516049200000,0.0,0.00011292569249095,47372.831501843700000000,0.0,0.0 +0xc13cad139d0a54bb496cb05be126fcbff785aeae,133.272154808804000000,0.0,5.349194089402480000,0.0,0.0,0.0,0.0,960.083214960830000000 +0x3b410f92ccdfad18477c9b4f325cec96d9dd397f,0.0,0.0,0.557712812169396000,0.0,0.0,0.0,0.0,0.0 +0x4ba13102569af816bc3cfbad0c95d478fa3df58c,0.0,2.783540383999180000,0.0,0.0,0.0,0.0,0.0,0.0 +0xaa8bdb60ee28e7616bfe4867f58bfe4edf858271,0.0,2.21340431752816000,0.0,0.0,0.0,0.0,0.0,0.0 +0x4475d1be974301106036061898b26fd5d62dbf5c,0.0,1.942797704527000000,0.0,0.0,0.0,0.0,0.0,0.0 +0xa53c541d155c06a6fc0b0d42ea26ad7414cf547b,1.843331989904990000,1.800095160121950000,0.0,0.0,0.0,0.0,0.0,0.0 +0x77f75363faeaae05aa54aae33e19a0c901147c11,0.0,1.686787607385370000,0.0,0.0,0.0,0.0,0.0,0.0 +0xf0419ee1156cc75fc0dbaa1906f85782430a5f6e,11.119580890218900000,1.512269595012310000,0.0,0.0,0.0,0.0,0.0,0.0 +0x2418c7ff88f10b461566a65d5563c22aba85ab2b,0.0,1.089321289333510000,0.0,0.0,0.0,0.0,0.0,0.0 +0x7e497d71fc537a0d859211cbef7cca2fa648f8c1,0.0,0.392520145716080000,0.0,0.0,0.0,0.0,0.0,0.0 +0xec04eaefdd9a514964f136bd3e02398ec62ecc24,0.0,0.230271886497572000,0.0,0.0,0.0,0.0,0.0,0.0 +0xb22b1187beacfda3fe2a414d0bcb65c2c2d3012e,0.0,0.00000034287503446,0.0,0.0,0.0,0.0,0.0,0.0 +0x613d6139eac603587eb97638993692a78aa9c447,4334.786550534810000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xb58c189fad07daf826542ac9f3a3c3a2c5ac4a75,3109.406086213240000000,0.0,0.0,0,0.0,0,0.0,0.0 +0xf82ca9d627b15336de5f88dea0a338cd283188a0,981.031513478706000000,0.0,0.0,0.0,91.849203228706000000,10.205467025411800000,0.0,0.0 +0x5df89e500d14fbdc01ca39af9e76e76bc46c7a09,960.180677776469000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xa2e2c0ef708ecdeebf7da840f2b38389d19803db,556.210015451470000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x14f4f859281e3f941d5194c1938bbab1290e7dcf,532.522818772014000000,0.0,0.0,0.0,0.000202059286792027,10.194628696466000000,0.0,0.0 +0xbf9b490af060529a7f89d155b3d045b896bb646e,500.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x4b80ef7c6d4c4cdbe28029852ebaf1b88ad2b35d,442.107290969366000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x93f5043925c4d2a28628330820925fe0a82d2b24,200.666500752926000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x3a887cf29012fb8ab4ee196a3eaccdaf57946fa8,106.302679447526000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x7f317b488fd3346a377ef178fde494aa59b044f7,106.065184880120000000,0.0,0.0,0.0,106.065184880120000000,0.0,0.0,0.0 +0x2d0c7a0807a21615fb945dd64afde7861dfb9c43,103.256961292433000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x73234a37e49902136eb5318804f195b78cfdea34,100.333250376463000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xca3ab843b1c0665816b45cee77b3a0c1c3338c98,99.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xc04a3df04fe48c261a233e46110b0fdadab1733e,52.9010858,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xd6e65d0a291115fb7319f73c49c1b703d252a7c0,50.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x691d6724e2e956457632b5072b2f0ee826ae0b61,43.946665997643400000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x11ededebf63bef0ea2d2d071bdf88f71543ec6fb,33.2831386825,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xa98d587471b48518163d3d2268ef4ed42cd69614,28.926878749537300000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xa4036d9c5d1c5edb323cedc88699e8241a3773bd,27.51498925023970000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xf43f5be06615a0303c8cff19e38cc1fe0f0ebbc3,22.698792565668700000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xbed58e0dcbc4b4ac0a9fce1d2f2804fbb6fe49aa,22.6838414,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x65bc72f5e5daefe930f1b468fc73ec96b0228956,19.96,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x9c2fa2cddea1c0a612049728d4af9ba20fe58630,17.428487589893900000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xd161099739c555b6d3d5e565cd55c470ee430f0e,16.77351213143630000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xd89c07d7abbf83e4bac5907567c8cc1b32491450,12.833626055653400000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xbdb4cb303a4e288110d57e9b25ad96242b5f1b9d,12.601254247781500000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xbf3cd4e28ced7f61c588693c018f4f38b4b0444e,11.6494124,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xc0ec851c663f97399cc749ebe798c9153b0dbb4b,11.0000728,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xacdceb490c614fa827c4f20710ee38e6b27d0eb2,10.256446,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x55fd2a393793cdb546fe0ab1fdc37df8f61520f4,10.136510683722700000,0.0,0.0,0.0,10.136510683722700000,0.0,0.0,0.0 +0xb5ee4f9dfcab6198dee8b013a74c951a44b8d78d,10.033325037646300000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x52ff0010d4058bb726725ad76f542c53033d67a1,9.98,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x627e46f5922b5601ada533cb229c519103537c28,9.98,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xad382901be4c94467fefbf32e0764cd977b67344,9.95,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x593bb3859dd0d244e94e233745a2542c732e1fe3,9.8310598,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xf4ce1da492110616024d401f8c659ff395851726,8.673608828544470000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x9d52de02cdc6eac4245b5a838b6e776fe1f1d312,8.275479797979800,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x45aecad3551f5c628e07a2a2b190bce2229fde5a,6.965,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x96451702bfe9ec3c5718402c99e69ed5776c4b37,6.296440755957810000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xb1f5dd6746151c73047838694c04b31494511c2c,6.2500706,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x8f1421db7c4dfd995e3b2209b754a22d8cc5a35e,4.8905,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x643777228acf1198d5e1a595dc12911955182376,4.756805800000000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x67735e8032e1d191a5cfd55c0e117fd045a7508e,4.7086638,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x8f918a9e919cc28c12169a9f4a36ac2fbeb89c42,3.4491855,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x6a4376a31623db641aa21f1e5cd63da526657b89,3.187057495463650000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x0818b8938fcd0a253ccdede9ec417277d3ca11e3,2.98105,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x79db77b84a811ced34651dce941dfb707a8b9e8b,2.124319,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x5915ee060ec503cee03b4e81490cc424868d799f,2.100644,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x29d60a12b00b1f7ebe1f67c82a832ec6d2727439,1.996,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xb5a48798d829b3389df6bd39189ba46128967bf2,1.995987362831990000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xf19c6fe6eb173f2c1c19c47a4e87ba2bba570a08,1.99,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x8ec1c09522758be634a6d9f0e3661c8b1f91a5e4,1.8,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x6728a80cf45eebe656fbd5b3d3820a9a05f78c98,1.561566019313000000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xe53f8cc868dc2e0fb1da5bd1b5e6404600a6de22,1.5498856,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xe03311b4590f5516739bf4c5197bcdbbbfc9d7e0,1.511471,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xa7eef766b1f3f3d31a0c7c6ebd0b3f31e9a87634,1.369911088296350000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x77c2da8140693996be6bc72776cb1f04a77a4e68,1.317385400123450000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x7977b909d55a53f9c73140f7f611eaf0638238ed,1.2975958,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x9ce6e6b60c894d1df9bc3d9d6cc969b79fb176b7,1.256263392677580000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x4dc810b632409bcbd2b7f8b5ace94279bc68cdd5,1.1885774,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xbd938b6b6f83e5535c649e921bc9d6151e86c100,1.1763185,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x872c9926d1ba0794a637c23ecb45bb590273d6d3,1.1431092,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x6d8b62e180c841e721a61f6003b148a76f246cec,1.1376202,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0xb6ebe9453a42315a54e3184cd59b70a4924c1064,1.0978,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x9c299fa124bdfec5e5fdbb2cf480ac7d914691c6,1.0500678,0.0,0.0,0.0,0.0,0.0,0.0,0.0 +0x13b91b3ff58886ace7637e547c53bbc2936d803f,1.043991634203420000,0.0,0.0,0.0,0.0,0.0,0.0,0.0 diff --git a/packages/bonds/deploy/.defines.ts b/packages/bonds/deploy/.defines.ts new file mode 100644 index 0000000..7f9acae --- /dev/null +++ b/packages/bonds/deploy/.defines.ts @@ -0,0 +1,90 @@ +/* eslint-disable node/no-unpublished-import,node/no-missing-import */ + +import { ethers, getNamedAccounts, network } from 'hardhat'; +import { HardhatDeployRuntimeEnvironment } from '../types/hardhat-deploy'; +import { HardhatRuntimeEnvironment } from 'hardhat/types/runtime'; +import { useLogger } from '../scripts/utils'; +import { resolve } from 'path'; +import { mkdir, writeFile } from 'fs/promises'; +import { DeployResult } from 'hardhat-deploy/types'; + +export type NetworkName = 'bsc' | 'bsctest' | 'hardhat'; + +export function useNetworkName() { + return network.name as NetworkName; +} + +const logger = useLogger(__filename); + + +export async function writeExtraMeta(name: string, meta?: { class?: string; instance?: string } | string) { + const directory = resolve(__dirname, '..', 'deployments', useNetworkName(), '.extraMeta'); + await mkdir(directory, { recursive: true }); + + const className = typeof meta === 'string' ? meta : meta?.class || name; + const instanceName = typeof meta === 'string' ? meta : meta?.instance || className; + await writeFile( + resolve(directory, name + '.json'), + JSON.stringify({ class: className, instance: instanceName }, null, 2), + ); +} + +export async function isProxiedContractDeployable( + hre: HardhatRuntimeEnvironment | HardhatDeployRuntimeEnvironment, + name: string, +) { + const { deployments } = hre as unknown as HardhatDeployRuntimeEnvironment; + const { all, get } = deployments; + const { deployer } = await getNamedAccounts(); + + if (!Object.keys(await all()).includes(name)) return true; + // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1) see: https://eips.ethereum.org/EIPS/eip-1967 + const proxyAdminSlot = '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103'; + const adminSlotValue = await ethers.provider.getStorageAt((await get(name)).address, proxyAdminSlot); + // not proxy or not deployed yet + if (adminSlotValue === '0x0000000000000000000000000000000000000000000000000000000000000000') { + return true; + } + + const owner = `0x${adminSlotValue.substring(26).toLowerCase()}`; + return deployer.toLowerCase() === owner; +} + +export async function advancedDeploy( + options: { + hre: HardhatRuntimeEnvironment; + name: string; + logger: ReturnType; + proxied?: boolean; + class?: string; + instance?: string; + dryRun?: boolean; + }, + fn: (ctx: typeof options) => Promise, +): Promise { + const { + deployments: { get }, + } = options.hre as unknown as HardhatDeployRuntimeEnvironment; + const deploy = + (options.dryRun || process.env.DEPLOY_DRY_RUN === '1') !== true + ? fn + : async () => { + options.logger.info(`[DRY] [DEPLOYING]`); + return { ...(await get(options.name)), newlyDeployed: false }; + }; + + const complete = async () => { + const result = await deploy(options); + options.logger.info(`${options.name}`, result.address); + await writeExtraMeta(options.name, { class: options.class, instance: options.instance }); + return result; + }; + + if (process.env.DEPLOY_NO_PROXY_OWNER_VALIDATION === '1' || !options.proxied) return await complete(); + if (!(await isProxiedContractDeployable(options.hre, options.name))) { + options.logger.warn(`${options.name} is a proxied contract, but you are not allowed to deploy.`); + return { ...(await get(options.name)), newlyDeployed: false }; + } + options.logger.info(`${options.name} is a proxied contract, and you are allowed to deploy`); + return await complete(); +} diff --git a/packages/bonds/deploy/001_deploy-handler.ts b/packages/bonds/deploy/001_deploy-handler.ts new file mode 100644 index 0000000..ead73d5 --- /dev/null +++ b/packages/bonds/deploy/001_deploy-handler.ts @@ -0,0 +1,158 @@ +import { DeployFunction } from 'hardhat-deploy/types' +import { HardhatRuntimeEnvironment } from 'hardhat/types' +import config from '../config' +// eslint-disable-next-line node/no-unpublished-import +import { useLogger } from '../scripts/utils' +import { HardhatDeployRuntimeEnvironment } from '../types/hardhat-deploy' +import { useNetworkName, advancedDeploy } from './.defines' + +// eslint-disable-next-line node/no-missing-import +import * as csv from 'csv/sync' +import * as fs from 'fs' +import * as path from 'path' +import { parseInt } from 'lodash' +import { BigNumber as EthersBigNumber } from 'ethers' +import BigNumber from 'bignumber.js' +import { tokens } from '../scripts/compensasion' + +enum Names { + AccidentHandler20220715V3 = 'AccidentHandler20220715V3', +} + +const gasLimit = 3000000 +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + +const logger = useLogger(__filename) +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const { deployments, getNamedAccounts } = hre as unknown as HardhatDeployRuntimeEnvironment + const { deploy, get, read, execute } = deployments + + const networkName = useNetworkName() + const { deployer } = await getNamedAccounts() + + const endingAt = Math.round(Date.now() / 1000) + 1 * 60 * 60 * 24 * 61 + + const ret = await advancedDeploy( + { + hre, + logger, + proxied: true, + name: Names.AccidentHandler20220715V3, + }, + async ({ name }) => { + return await deploy(name, { + from: deployer, + contract: name, + proxy: { + execute: { + init: { + methodName: 'initialize', + args: [deployer, endingAt], + }, + }, + }, + log: true, + autoMine: true, // speed up deployment on local network (ganache, hardhat), no effect on live networks + }) + }, + ) + if (ret.newlyDeployed && ret.numDeployments && ret.numDeployments <= 1) { + await addRecords(hre) + } + await queryRemainTokenMap(hre) +} +export default func + +async function addRecords(hre: HardhatRuntimeEnvironment) { + const { deployments, getNamedAccounts } = hre as unknown as HardhatDeployRuntimeEnvironment + const { execute } = deployments + const { deployer } = await getNamedAccounts() + const rows: Array<{ + Account: string + // eslint-disable-next-line camelcase + BUSD_0xe9e7cea3dedca5984780bafc599bd69add087d56: string + 'dWTI-BUSD_0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d': string + 'dXAU-BUSD_0x95ca57ff396864c25520bc97deaae978daaf73f3': string + 'dTMC-BUSD_0xf048897b35963aaed1a241512d26540c7ec42a60': string + 'dUSD-BUSD-to-BUSD': string + 'dUSD-BUSD-vault-to-BUSD': string + 'DUET-dUSD-to-DUET-CAKE_0xbdf0aa1d1985caa357a6ac6661d838da8691c569': string + 'DUET-dUSD-vault-to-DUET-CAKE': string + }> = csv.parse(fs.readFileSync(path.join(__dirname, '../data/userCompensation-0810-1909-filtered.csv')), { + columns: true, + // cast: true, + }) + + console.log(rows) + + const records: Array<{ + user: string + token: string + amount: string + }> = [] + + for (const row of rows) { + const user = row.Account + if (parseFloat(row.BUSD_0xe9e7cea3dedca5984780bafc599bd69add087d56) >= 0.1) { + records.push({ + user, + token: '0xe9e7cea3dedca5984780bafc599bd69add087d56', + amount: new BigNumber(row.BUSD_0xe9e7cea3dedca5984780bafc599bd69add087d56).multipliedBy(1e18).toFixed(), + }) + } + if (parseFloat(row['dWTI-BUSD_0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d']) >= 0.1) { + records.push({ + user, + token: '0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d', + amount: new BigNumber(row['dWTI-BUSD_0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d']).multipliedBy(1e18).toFixed(), + }) + } + if (parseFloat(row['dXAU-BUSD_0x95ca57ff396864c25520bc97deaae978daaf73f3']) >= 0.1) { + records.push({ + user, + token: '0x95ca57ff396864c25520bc97deaae978daaf73f3', + amount: new BigNumber(row['dXAU-BUSD_0x95ca57ff396864c25520bc97deaae978daaf73f3']).multipliedBy(1e18).toFixed(), + }) + } + if (parseFloat(row['dTMC-BUSD_0xf048897b35963aaed1a241512d26540c7ec42a60']) >= 0.1) { + records.push({ + user, + token: '0xf048897b35963aaed1a241512d26540c7ec42a60', + amount: new BigNumber(row['dTMC-BUSD_0xf048897b35963aaed1a241512d26540c7ec42a60']).multipliedBy(1e18).toFixed(), + }) + } + if (parseFloat(row['DUET-dUSD-to-DUET-CAKE_0xbdf0aa1d1985caa357a6ac6661d838da8691c569']) >= 0.1) { + records.push({ + user, + token: '0xbdf0aa1d1985caa357a6ac6661d838da8691c569', + amount: new BigNumber(row['DUET-dUSD-to-DUET-CAKE_0xbdf0aa1d1985caa357a6ac6661d838da8691c569']) + .multipliedBy(1e18) + .toFixed(), + }) + } + } + + logger.info('adding records', records.length) + await execute( + Names.AccidentHandler20220715V3, + { + from: deployer, + gasLimit: 3000000, + }, + 'setRecords', + records, + ) + logger.info('added records', records.length) +} + +async function queryRemainTokenMap(hre: HardhatRuntimeEnvironment) { + const { deployments } = hre as unknown as HardhatDeployRuntimeEnvironment + const { read } = deployments + const remainTokenMap: Record = {} + for (const [symbol, address] of Object.entries(tokens)) { + remainTokenMap[symbol] = ( + (await read(Names.AccidentHandler20220715V3, 'remainTokenMap', address)) as EthersBigNumber + ).toString() + } + console.log('remainTokenMap', remainTokenMap) +} diff --git a/packages/bonds/deployments/bsc/.chainId b/packages/bonds/deployments/bsc/.chainId new file mode 100644 index 0000000..2ebc651 --- /dev/null +++ b/packages/bonds/deployments/bsc/.chainId @@ -0,0 +1 @@ +56 \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/.extraMeta/AccidentHandler20220715V3.json b/packages/bonds/deployments/bsc/.extraMeta/AccidentHandler20220715V3.json new file mode 100644 index 0000000..ed332ea --- /dev/null +++ b/packages/bonds/deployments/bsc/.extraMeta/AccidentHandler20220715V3.json @@ -0,0 +1,4 @@ +{ + "class": "AccidentHandler20220715V3", + "instance": "AccidentHandler20220715V3" +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/AccidentHandler20220715V3.json b/packages/bonds/deployments/bsc/AccidentHandler20220715V3.json new file mode 100644 index 0000000..77ca956 --- /dev/null +++ b/packages/bonds/deployments/bsc/AccidentHandler20220715V3.json @@ -0,0 +1,540 @@ +{ + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ProxyImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "id", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Retrieve", + "type": "event" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "endingAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "endingAt_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "remainTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrievables", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrieveTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrieved", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "endingAt_", + "type": "uint256" + } + ], + "name": "setEndingAt", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct AccidentHandler20220715V3.Record[]", + "name": "records_", + "type": "tuple[]" + } + ], + "name": "setRecords", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20Upgradeable[]", + "name": "tokens_", + "type": "address[]" + } + ], + "name": "transferTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRetrievableTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRetrievedTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementationAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "ownerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "receipt": { + "to": null, + "from": "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", + "contractAddress": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "transactionIndex": 52, + "gasUsed": "692905", + "logsBloom": "0x00000000000000000000000000000000002000000000004000800000000000000010000000000000000400000000000000000000000000000000000000000000001000000000000000000040000000000001000000000000000600000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000180000000000000000000000040000000000000000000000600000000000000000000000000000000000000000000000000000000000000050000000000000000000004000000000020000000000000000000000400000000000000000000000000000000000000000000", + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec", + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "logs": [ + { + "transactionIndex": 52, + "blockNumber": 20354295, + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "topics": [ + "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000765675852c05d358b6c5b9edf30da8b36ebd9b66" + ], + "data": "0x", + "logIndex": 176, + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" + }, + { + "transactionIndex": 52, + "blockNumber": 20354295, + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "topics": [ + "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", + "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf", + "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf" + ], + "data": "0x", + "logIndex": 177, + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" + }, + { + "transactionIndex": 52, + "blockNumber": 20354295, + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 178, + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" + }, + { + "transactionIndex": 52, + "blockNumber": 20354295, + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf" + ], + "data": "0x", + "logIndex": 179, + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" + } + ], + "blockNumber": 20354295, + "cumulativeGasUsed": "7296349", + "status": 1, + "byzantium": true + }, + "args": [ + "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", + "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", + "0xcd6dc68700000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf000000000000000000000000000000000000000000000000000000006345aef5" + ], + "numDeployments": 1, + "solcInputHash": "41a8600e180880fe88609322a6b2ac21", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/proxy/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/proxy/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n constructor(\\n address implementationAddress,\\n address ownerAddress,\\n bytes memory data\\n ) payable {\\n _setImplementation(implementationAddress, data);\\n _setOwner(ownerAddress);\\n }\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xb9c14a66c8a4eefabca13cc8dd8133c1587909bb1124fa793c50ab46358b63e4\",\"license\":\"MIT\"},\"solc_0.8/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 {\\n revert(0, retSz)\\n }\\n default {\\n return(0, retSz)\\n }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success, ) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x68c8cf1a340a53d31de8ed808bb66d64e83d50b20d80a0b2dff6aba903cebc98\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405162000ccc38038062000ccc8339810160408190526200002691620001fc565b62000032838262000046565b6200003d8262000128565b505050620002fa565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511562000123576000836001600160a01b031683604051620000ca9190620002dc565b600060405180830381855af49150503d806000811462000107576040519150601f19603f3d011682016040523d82523d6000602084013e6200010c565b606091505b505090508062000121573d806000803e806000fd5b505b505050565b60006200014260008051602062000cac8339815191525490565b90508160008051602062000cac83398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80516001600160a01b0381168114620001b257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001ea578181015183820152602001620001d0565b83811115620001215750506000910152565b6000806000606084860312156200021257600080fd5b6200021d846200019a565b92506200022d602085016200019a565b60408501519092506001600160401b03808211156200024b57600080fd5b818601915086601f8301126200026057600080fd5b815181811115620002755762000275620001b7565b604051601f8201601f19908116603f01168101908382118183101715620002a057620002a0620001b7565b81604052828152896020848701011115620002ba57600080fd5b620002cd836020830160208801620001cd565b80955050505050509250925092565b60008251620002f0818460208701620001cd565b9190910192915050565b6109a2806200030a6000396000f3fe60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033", + "execute": { + "methodName": "initialize", + "args": [ + "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", + 1665511157 + ] + }, + "implementation": "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Proxy implementing EIP173 for ownership management", + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Implementation.json b/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Implementation.json new file mode 100644 index 0000000..8778743 --- /dev/null +++ b/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Implementation.json @@ -0,0 +1,421 @@ +{ + "address": "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Retrieve", + "type": "event" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "endingAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "endingAt_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "remainTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrievables", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrieveTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrieved", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "endingAt_", + "type": "uint256" + } + ], + "name": "setEndingAt", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct AccidentHandler20220715V3.Record[]", + "name": "records_", + "type": "tuple[]" + } + ], + "name": "setRecords", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20Upgradeable[]", + "name": "tokens_", + "type": "address[]" + } + ], + "name": "transferTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRetrievableTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRetrievedTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xa2b350650a4a14ed89f0a3ce8995e52b19d9f04e13a23b46bcf4102a2c5fa3b9", + "receipt": { + "to": null, + "from": "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", + "contractAddress": "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", + "transactionIndex": 34, + "gasUsed": "1143235", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x257a16992106f7f5cd7a482e21248e781848286c65e8ca3a3d368e8b378470c2", + "transactionHash": "0xa2b350650a4a14ed89f0a3ce8995e52b19d9f04e13a23b46bcf4102a2c5fa3b9", + "logs": [], + "blockNumber": 20354292, + "cumulativeGasUsed": "4206900", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "123cc147802b234c976c6c4db54070fc", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Retrieve\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endingAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"endingAt_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"remainTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrievables\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrieveTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrieved\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"endingAt_\",\"type\":\"uint256\"}],\"name\":\"setEndingAt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct AccidentHandler20220715V3.Record[]\",\"name\":\"records_\",\"type\":\"tuple[]\"}],\"name\":\"setRecords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"tokens_\",\"type\":\"address[]\"}],\"name\":\"transferTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userRetrievableTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userRetrievedTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/AccidentHandler20220715V3.sol\":\"AccidentHandler20220715V3\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n function safeTransfer(\\n IERC20Upgradeable token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20Upgradeable token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3e26a49d2fa5ef8338b8a9467c91e54f417cb07e849b1cc0f4ebc4d2a147938e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@private/shared/libs/Adminable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nabstract contract Adminable {\\n event AdminUpdated(address indexed user, address indexed newAdmin);\\n\\n address public admin;\\n\\n modifier onlyAdmin() virtual {\\n require(msg.sender == admin, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n function setAdmin(address newAdmin) public virtual onlyAdmin {\\n _setAdmin(newAdmin);\\n }\\n\\n function _setAdmin(address newAdmin) internal {\\n require(newAdmin != address(0), \\\"Can not set admin to zero address\\\");\\n admin = newAdmin;\\n\\n emit AdminUpdated(msg.sender, newAdmin);\\n }\\n}\\n\",\"keccak256\":\"0xe47c97c0e3edad2d1df3e664376a7bb46e1aaf51b4c4acc73c4a2cfdc747185f\",\"license\":\"GPL-3.0\"},\"contracts/AccidentHandler20220715V3.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\npragma abicoder v2;\\n\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"@private/shared/libs/Adminable.sol\\\";\\n\\n\\ncontract AccidentHandler20220715V3 is Initializable, Adminable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n // [user]: [token]: amount # retrievable\\n mapping(address => mapping(address => uint)) public userRetrievableTokenMap;\\n // [user]: [token]: amount # retrieved\\n mapping(address => mapping(address => uint)) public userRetrievedTokenMap;\\n // [token]: amount # retrievable\\n mapping(address => uint) public remainTokenMap;\\n\\n uint public endingAt;\\n\\n event Retrieve(address user, address token, uint amount);\\n\\n struct Record {\\n address user;\\n address token;\\n uint amount;\\n }\\n\\n function initialize(address admin_, uint endingAt_) public initializer {\\n require(admin_ != address(0), \\\"Can't set admin to zero address\\\");\\n _setAdmin(admin_);\\n setEndingAt(endingAt_);\\n }\\n\\n function retrievables(address[] calldata tokens) external view returns (uint[] memory) {\\n uint[] memory amounts = new uint[](tokens.length);\\n for (uint i; i < tokens.length; i++) {\\n amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]];\\n }\\n return amounts;\\n }\\n\\n function retrieved(address[] calldata tokens) external view returns (uint[] memory) {\\n uint[] memory amounts = new uint[](tokens.length);\\n for (uint i; i < tokens.length; i++) {\\n amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]];\\n }\\n return amounts;\\n }\\n\\n function setRecords(Record[] calldata records_) external onlyAdmin {\\n for (uint i; i < records_.length; i++) {\\n Record calldata record = records_[i];\\n if (record.amount <= 0) {\\n continue;\\n }\\n require(userRetrievableTokenMap[record.user][record.token] == 0\\n && userRetrievedTokenMap[record.user][record.token] == 0,\\n string(abi.encodePacked(\\\"Can not set twice for user\\\", record.user, \\\", token:\\\", record.token))\\n );\\n userRetrievableTokenMap[record.user][record.token] += record.amount;\\n remainTokenMap[record.token] += record.amount;\\n }\\n }\\n\\n function setEndingAt(uint endingAt_) public onlyAdmin {\\n require(endingAt_ > 0, \\\"Invalid ending time\\\");\\n endingAt = endingAt_;\\n }\\n\\n function retrieveTokens(address[] calldata tokens) external {\\n require(endingAt > block.timestamp, \\\"Out of window\\\");\\n for (uint i; i < tokens.length; i++) {\\n IERC20Upgradeable token = IERC20Upgradeable(tokens[i]);\\n uint amount = userRetrievableTokenMap[msg.sender][tokens[i]];\\n if (amount > 0) {\\n delete userRetrievableTokenMap[msg.sender][tokens[i]];\\n userRetrievedTokenMap[msg.sender][tokens[i]] += amount;\\n remainTokenMap[tokens[i]] -= amount;\\n token.safeTransfer(msg.sender, amount);\\n emit Retrieve(msg.sender, tokens[i], amount);\\n }\\n }\\n }\\n\\n function transferTokens(IERC20Upgradeable[] calldata tokens_) public onlyAdmin {\\n for (uint256 i = 0; i < tokens_.length; i++) {\\n IERC20Upgradeable token = tokens_[i];\\n token.safeTransfer(msg.sender, token.balanceOf(address(this)));\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc585eac7022a94f2783db764661ef71747619859ddda82a6d354ce374a17f6e1\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506113b9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639a22d5a61161008c578063cd6dc68711610066578063cd6dc687146101c7578063e797e9ef146101da578063f1a0d18b146101ed578063f851a4401461020d57600080fd5b80639a22d5a614610198578063a4d5b6f3146101ab578063c23b4988146101be57600080fd5b80632d915022146100d457806336463706146101125780635ab2fd3214610132578063704b6c021461014757806376de352d1461015a5780637fa3b3da1461016d575b600080fd5b6100ff6100e2366004610fe7565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61012561012036600461106c565b61023e565b60405161010991906110ae565b6101456101403660046110f2565b610321565b005b61014561015536600461110b565b6103a5565b61012561016836600461106c565b6103e1565b6100ff61017b366004610fe7565b600160209081526000928352604080842090915290825290205481565b6101456101a6366004611128565b6104bc565b6101456101b936600461106c565b610780565b6100ff60045481565b6101456101d536600461119d565b610888565b6101456101e836600461106c565b61095e565b6100ff6101fb36600461110b565b60036020526000908152604090205481565b600054610226906201000090046001600160a01b031681565b6040516001600160a01b039091168152602001610109565b606060008267ffffffffffffffff81111561025b5761025b6111c9565b604051908082528060200260200182016040528015610284578160200160208202803683370190505b50905060005b8381101561031957336000908152600160205260408120908686848181106102b4576102b46111df565b90506020020160208101906102c9919061110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106102fc576102fc6111df565b6020908102919091010152806103118161120b565b91505061028a565b509392505050565b6000546201000090046001600160a01b0316331461035a5760405162461bcd60e51b815260040161035190611226565b60405180910390fd5b600081116103a05760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420656e64696e672074696d6560681b6044820152606401610351565b600455565b6000546201000090046001600160a01b031633146103d55760405162461bcd60e51b815260040161035190611226565b6103de81610bee565b50565b606060008267ffffffffffffffff8111156103fe576103fe6111c9565b604051908082528060200260200182016040528015610427578160200160208202803683370190505b50905060005b838110156103195733600090815260026020526040812090868684818110610457576104576111df565b905060200201602081019061046c919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061049f5761049f6111df565b6020908102919091010152806104b48161120b565b91505061042d565b6000546201000090046001600160a01b031633146104ec5760405162461bcd60e51b815260040161035190611226565b60005b8181101561077b573683838381811061050a5761050a6111df565b905060600201905060008160400135116105245750610769565b60016000610535602084018461110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082602001602081019061056a919061110b565b6001600160a01b031681526020810191909152604001600020541580156105ee57506002600061059d602084018461110b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008260200160208101906105d2919061110b565b6001600160a01b03168152602081019190915260400160002054155b6105fb602083018361110b565b61060b604084016020850161110b565b6040517f43616e206e6f742073657420747769636520666f72207573657200000000000060208201526bffffffffffffffffffffffff19606093841b8116603a8301526716103a37b5b2b71d60c11b604e8301529190921b166056820152606a01604051602081830303815290604052906106995760405162461bcd60e51b8152600401610351919061127c565b506040810135600160006106b0602085018561110b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008360200160208101906106e5919061110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461071491906112af565b909155505060408101803590600390600090610733906020860161110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461076291906112af565b9091555050505b806107738161120b565b9150506104ef565b505050565b6000546201000090046001600160a01b031633146107b05760405162461bcd60e51b815260040161035190611226565b60005b8181101561077b5760008383838181106107cf576107cf6111df565b90506020020160208101906107e4919061110b565b6040516370a0823160e01b81523060048201529091506108759033906001600160a01b038416906370a082319060240160206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086491906112c7565b6001600160a01b0384169190610ca3565b50806108808161120b565b9150506107b3565b60006108946001610cf5565b905080156108ac576000805461ff0019166101001790555b6001600160a01b0383166109025760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207365742061646d696e20746f207a65726f2061646472657373006044820152606401610351565b61090b83610bee565b61091482610321565b801561077b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b426004541161099f5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f662077696e646f7760981b6044820152606401610351565b60005b8181101561077b5760008383838181106109be576109be6111df565b90506020020160208101906109d3919061110b565b33600090815260016020526040812091925090818686868181106109f9576109f96111df565b9050602002016020810190610a0e919061110b565b6001600160a01b0316815260208101919091526040016000205490508015610bd95733600090815260016020526040812090868686818110610a5257610a526111df565b9050602002016020810190610a67919061110b565b6001600160a01b0316815260208082019290925260409081016000908120819055338152600290925281208291878787818110610aa657610aa66111df565b9050602002016020810190610abb919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610aea91906112af565b9091555081905060036000878787818110610b0757610b076111df565b9050602002016020810190610b1c919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610b4b91906112e0565b90915550610b6590506001600160a01b0383163383610ca3565b7f8bd0db04d7d748ae70a6a244675345c05f70e540f344927714da92f35b2418ce33868686818110610b9957610b996111df565b9050602002016020810190610bae919061110b565b604080516001600160a01b039384168152929091166020830152810183905260600160405180910390a15b50508080610be69061120b565b9150506109a2565b6001600160a01b038116610c4e5760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b6064820152608401610351565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261077b908490610d7d565b60008054610100900460ff1615610d3c578160ff166001148015610d185750303b155b610d345760405162461bcd60e51b8152600401610351906112f7565b506000919050565b60005460ff808416911610610d635760405162461bcd60e51b8152600401610351906112f7565b506000805460ff191660ff92909216919091179055600190565b6000610dd2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e4f9092919063ffffffff16565b80519091501561077b5780806020019051810190610df09190611345565b61077b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610351565b6060610e5e8484600085610e68565b90505b9392505050565b606082471015610ec95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610351565b6001600160a01b0385163b610f205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610351565b600080866001600160a01b03168587604051610f3c9190611367565b60006040518083038185875af1925050503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b5091509150610f8e828286610f99565b979650505050505050565b60608315610fa8575081610e61565b825115610fb85782518084602001fd5b8160405162461bcd60e51b8152600401610351919061127c565b6001600160a01b03811681146103de57600080fd5b60008060408385031215610ffa57600080fd5b823561100581610fd2565b9150602083013561101581610fd2565b809150509250929050565b60008083601f84011261103257600080fd5b50813567ffffffffffffffff81111561104a57600080fd5b6020830191508360208260051b850101111561106557600080fd5b9250929050565b6000806020838503121561107f57600080fd5b823567ffffffffffffffff81111561109657600080fd5b6110a285828601611020565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156110e6578351835292840192918401916001016110ca565b50909695505050505050565b60006020828403121561110457600080fd5b5035919050565b60006020828403121561111d57600080fd5b8135610e6181610fd2565b6000806020838503121561113b57600080fd5b823567ffffffffffffffff8082111561115357600080fd5b818501915085601f83011261116757600080fd5b81358181111561117657600080fd5b86602060608302850101111561118b57600080fd5b60209290920196919550909350505050565b600080604083850312156111b057600080fd5b82356111bb81610fd2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561121f5761121f6111f5565b5060010190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60005b8381101561126757818101518382015260200161124f565b83811115611276576000848401525b50505050565b602081526000825180602084015261129b81604085016020870161124c565b601f01601f19169190910160400192915050565b600082198211156112c2576112c26111f5565b500190565b6000602082840312156112d957600080fd5b5051919050565b6000828210156112f2576112f26111f5565b500390565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60006020828403121561135757600080fd5b81518015158114610e6157600080fd5b6000825161137981846020870161124c565b919091019291505056fea26469706673582212201a371d8c26e9835bdf1c431a29f2afec84f77ca22889db0485227d008775e97a64736f6c63430008090033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639a22d5a61161008c578063cd6dc68711610066578063cd6dc687146101c7578063e797e9ef146101da578063f1a0d18b146101ed578063f851a4401461020d57600080fd5b80639a22d5a614610198578063a4d5b6f3146101ab578063c23b4988146101be57600080fd5b80632d915022146100d457806336463706146101125780635ab2fd3214610132578063704b6c021461014757806376de352d1461015a5780637fa3b3da1461016d575b600080fd5b6100ff6100e2366004610fe7565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61012561012036600461106c565b61023e565b60405161010991906110ae565b6101456101403660046110f2565b610321565b005b61014561015536600461110b565b6103a5565b61012561016836600461106c565b6103e1565b6100ff61017b366004610fe7565b600160209081526000928352604080842090915290825290205481565b6101456101a6366004611128565b6104bc565b6101456101b936600461106c565b610780565b6100ff60045481565b6101456101d536600461119d565b610888565b6101456101e836600461106c565b61095e565b6100ff6101fb36600461110b565b60036020526000908152604090205481565b600054610226906201000090046001600160a01b031681565b6040516001600160a01b039091168152602001610109565b606060008267ffffffffffffffff81111561025b5761025b6111c9565b604051908082528060200260200182016040528015610284578160200160208202803683370190505b50905060005b8381101561031957336000908152600160205260408120908686848181106102b4576102b46111df565b90506020020160208101906102c9919061110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106102fc576102fc6111df565b6020908102919091010152806103118161120b565b91505061028a565b509392505050565b6000546201000090046001600160a01b0316331461035a5760405162461bcd60e51b815260040161035190611226565b60405180910390fd5b600081116103a05760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420656e64696e672074696d6560681b6044820152606401610351565b600455565b6000546201000090046001600160a01b031633146103d55760405162461bcd60e51b815260040161035190611226565b6103de81610bee565b50565b606060008267ffffffffffffffff8111156103fe576103fe6111c9565b604051908082528060200260200182016040528015610427578160200160208202803683370190505b50905060005b838110156103195733600090815260026020526040812090868684818110610457576104576111df565b905060200201602081019061046c919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061049f5761049f6111df565b6020908102919091010152806104b48161120b565b91505061042d565b6000546201000090046001600160a01b031633146104ec5760405162461bcd60e51b815260040161035190611226565b60005b8181101561077b573683838381811061050a5761050a6111df565b905060600201905060008160400135116105245750610769565b60016000610535602084018461110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082602001602081019061056a919061110b565b6001600160a01b031681526020810191909152604001600020541580156105ee57506002600061059d602084018461110b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008260200160208101906105d2919061110b565b6001600160a01b03168152602081019190915260400160002054155b6105fb602083018361110b565b61060b604084016020850161110b565b6040517f43616e206e6f742073657420747769636520666f72207573657200000000000060208201526bffffffffffffffffffffffff19606093841b8116603a8301526716103a37b5b2b71d60c11b604e8301529190921b166056820152606a01604051602081830303815290604052906106995760405162461bcd60e51b8152600401610351919061127c565b506040810135600160006106b0602085018561110b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008360200160208101906106e5919061110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461071491906112af565b909155505060408101803590600390600090610733906020860161110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461076291906112af565b9091555050505b806107738161120b565b9150506104ef565b505050565b6000546201000090046001600160a01b031633146107b05760405162461bcd60e51b815260040161035190611226565b60005b8181101561077b5760008383838181106107cf576107cf6111df565b90506020020160208101906107e4919061110b565b6040516370a0823160e01b81523060048201529091506108759033906001600160a01b038416906370a082319060240160206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086491906112c7565b6001600160a01b0384169190610ca3565b50806108808161120b565b9150506107b3565b60006108946001610cf5565b905080156108ac576000805461ff0019166101001790555b6001600160a01b0383166109025760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207365742061646d696e20746f207a65726f2061646472657373006044820152606401610351565b61090b83610bee565b61091482610321565b801561077b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b426004541161099f5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f662077696e646f7760981b6044820152606401610351565b60005b8181101561077b5760008383838181106109be576109be6111df565b90506020020160208101906109d3919061110b565b33600090815260016020526040812091925090818686868181106109f9576109f96111df565b9050602002016020810190610a0e919061110b565b6001600160a01b0316815260208101919091526040016000205490508015610bd95733600090815260016020526040812090868686818110610a5257610a526111df565b9050602002016020810190610a67919061110b565b6001600160a01b0316815260208082019290925260409081016000908120819055338152600290925281208291878787818110610aa657610aa66111df565b9050602002016020810190610abb919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610aea91906112af565b9091555081905060036000878787818110610b0757610b076111df565b9050602002016020810190610b1c919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610b4b91906112e0565b90915550610b6590506001600160a01b0383163383610ca3565b7f8bd0db04d7d748ae70a6a244675345c05f70e540f344927714da92f35b2418ce33868686818110610b9957610b996111df565b9050602002016020810190610bae919061110b565b604080516001600160a01b039384168152929091166020830152810183905260600160405180910390a15b50508080610be69061120b565b9150506109a2565b6001600160a01b038116610c4e5760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b6064820152608401610351565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261077b908490610d7d565b60008054610100900460ff1615610d3c578160ff166001148015610d185750303b155b610d345760405162461bcd60e51b8152600401610351906112f7565b506000919050565b60005460ff808416911610610d635760405162461bcd60e51b8152600401610351906112f7565b506000805460ff191660ff92909216919091179055600190565b6000610dd2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e4f9092919063ffffffff16565b80519091501561077b5780806020019051810190610df09190611345565b61077b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610351565b6060610e5e8484600085610e68565b90505b9392505050565b606082471015610ec95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610351565b6001600160a01b0385163b610f205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610351565b600080866001600160a01b03168587604051610f3c9190611367565b60006040518083038185875af1925050503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b5091509150610f8e828286610f99565b979650505050505050565b60608315610fa8575081610e61565b825115610fb85782518084602001fd5b8160405162461bcd60e51b8152600401610351919061127c565b6001600160a01b03811681146103de57600080fd5b60008060408385031215610ffa57600080fd5b823561100581610fd2565b9150602083013561101581610fd2565b809150509250929050565b60008083601f84011261103257600080fd5b50813567ffffffffffffffff81111561104a57600080fd5b6020830191508360208260051b850101111561106557600080fd5b9250929050565b6000806020838503121561107f57600080fd5b823567ffffffffffffffff81111561109657600080fd5b6110a285828601611020565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156110e6578351835292840192918401916001016110ca565b50909695505050505050565b60006020828403121561110457600080fd5b5035919050565b60006020828403121561111d57600080fd5b8135610e6181610fd2565b6000806020838503121561113b57600080fd5b823567ffffffffffffffff8082111561115357600080fd5b818501915085601f83011261116757600080fd5b81358181111561117657600080fd5b86602060608302850101111561118b57600080fd5b60209290920196919550909350505050565b600080604083850312156111b057600080fd5b82356111bb81610fd2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561121f5761121f6111f5565b5060010190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60005b8381101561126757818101518382015260200161124f565b83811115611276576000848401525b50505050565b602081526000825180602084015261129b81604085016020870161124c565b601f01601f19169190910160400192915050565b600082198211156112c2576112c26111f5565b500190565b6000602082840312156112d957600080fd5b5051919050565b6000828210156112f2576112f26111f5565b500390565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60006020828403121561135757600080fd5b81518015158114610e6157600080fd5b6000825161137981846020870161124c565b919091019291505056fea26469706673582212201a371d8c26e9835bdf1c431a29f2afec84f77ca22889db0485227d008775e97a64736f6c63430008090033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 6, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 9, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 696, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "admin", + "offset": 2, + "slot": "0", + "type": "t_address" + }, + { + "astId": 768, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "userRetrievableTokenMap", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 774, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "userRetrievedTokenMap", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 778, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "remainTokenMap", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 780, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "endingAt", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Proxy.json b/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Proxy.json new file mode 100644 index 0000000..cc79002 --- /dev/null +++ b/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Proxy.json @@ -0,0 +1,244 @@ +{ + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "implementationAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "ownerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ProxyImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "id", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "receipt": { + "to": null, + "from": "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", + "contractAddress": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "transactionIndex": 52, + "gasUsed": "692905", + "logsBloom": "0x00000000000000000000000000000000002000000000004000800000000000000010000000000000000400000000000000000000000000000000000000000000001000000000000000000040000000000001000000000000000600000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000180000000000000000000000040000000000000000000000600000000000000000000000000000000000000000000000000000000000000050000000000000000000004000000000020000000000000000000000400000000000000000000000000000000000000000000", + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec", + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "logs": [ + { + "transactionIndex": 52, + "blockNumber": 20354295, + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "topics": [ + "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000765675852c05d358b6c5b9edf30da8b36ebd9b66" + ], + "data": "0x", + "logIndex": 176, + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" + }, + { + "transactionIndex": 52, + "blockNumber": 20354295, + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "topics": [ + "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", + "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf", + "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf" + ], + "data": "0x", + "logIndex": 177, + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" + }, + { + "transactionIndex": 52, + "blockNumber": 20354295, + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 178, + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" + }, + { + "transactionIndex": 52, + "blockNumber": 20354295, + "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", + "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf" + ], + "data": "0x", + "logIndex": 179, + "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" + } + ], + "blockNumber": 20354295, + "cumulativeGasUsed": "7296349", + "status": 1, + "byzantium": true + }, + "args": [ + "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", + "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", + "0xcd6dc68700000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf000000000000000000000000000000000000000000000000000000006345aef5" + ], + "numDeployments": 1, + "solcInputHash": "41a8600e180880fe88609322a6b2ac21", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/proxy/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/proxy/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n constructor(\\n address implementationAddress,\\n address ownerAddress,\\n bytes memory data\\n ) payable {\\n _setImplementation(implementationAddress, data);\\n _setOwner(ownerAddress);\\n }\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xb9c14a66c8a4eefabca13cc8dd8133c1587909bb1124fa793c50ab46358b63e4\",\"license\":\"MIT\"},\"solc_0.8/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 {\\n revert(0, retSz)\\n }\\n default {\\n return(0, retSz)\\n }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success, ) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x68c8cf1a340a53d31de8ed808bb66d64e83d50b20d80a0b2dff6aba903cebc98\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405162000ccc38038062000ccc8339810160408190526200002691620001fc565b62000032838262000046565b6200003d8262000128565b505050620002fa565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511562000123576000836001600160a01b031683604051620000ca9190620002dc565b600060405180830381855af49150503d806000811462000107576040519150601f19603f3d011682016040523d82523d6000602084013e6200010c565b606091505b505090508062000121573d806000803e806000fd5b505b505050565b60006200014260008051602062000cac8339815191525490565b90508160008051602062000cac83398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80516001600160a01b0381168114620001b257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001ea578181015183820152602001620001d0565b83811115620001215750506000910152565b6000806000606084860312156200021257600080fd5b6200021d846200019a565b92506200022d602085016200019a565b60408501519092506001600160401b03808211156200024b57600080fd5b818601915086601f8301126200026057600080fd5b815181811115620002755762000275620001b7565b604051601f8201601f19908116603f01168101908382118183101715620002a057620002a0620001b7565b81604052828152896020848701011115620002ba57600080fd5b620002cd836020830160208801620001cd565b80955050505050509250925092565b60008251620002f0818460208701620001cd565b9190910192915050565b6109a2806200030a6000396000f3fe60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Proxy implementing EIP173 for ownership management", + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/solcInputs/123cc147802b234c976c6c4db54070fc.json b/packages/bonds/deployments/bsc/solcInputs/123cc147802b234c976c6c4db54070fc.json new file mode 100644 index 0000000..9515982 --- /dev/null +++ b/packages/bonds/deployments/bsc/solcInputs/123cc147802b234c976c6c4db54070fc.json @@ -0,0 +1,55 @@ +{ + "language": "Solidity", + "sources": { + "contracts/AccidentHandler20220715V3.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\npragma abicoder v2;\n\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\nimport \"@private/shared/libs/Adminable.sol\";\n\n\ncontract AccidentHandler20220715V3 is Initializable, Adminable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n // [user]: [token]: amount # retrievable\n mapping(address => mapping(address => uint)) public userRetrievableTokenMap;\n // [user]: [token]: amount # retrieved\n mapping(address => mapping(address => uint)) public userRetrievedTokenMap;\n // [token]: amount # retrievable\n mapping(address => uint) public remainTokenMap;\n\n uint public endingAt;\n\n event Retrieve(address user, address token, uint amount);\n\n struct Record {\n address user;\n address token;\n uint amount;\n }\n\n function initialize(address admin_, uint endingAt_) public initializer {\n require(admin_ != address(0), \"Can't set admin to zero address\");\n _setAdmin(admin_);\n setEndingAt(endingAt_);\n }\n\n function retrievables(address[] calldata tokens) external view returns (uint[] memory) {\n uint[] memory amounts = new uint[](tokens.length);\n for (uint i; i < tokens.length; i++) {\n amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]];\n }\n return amounts;\n }\n\n function retrieved(address[] calldata tokens) external view returns (uint[] memory) {\n uint[] memory amounts = new uint[](tokens.length);\n for (uint i; i < tokens.length; i++) {\n amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]];\n }\n return amounts;\n }\n\n function setRecords(Record[] calldata records_) external onlyAdmin {\n for (uint i; i < records_.length; i++) {\n Record calldata record = records_[i];\n if (record.amount <= 0) {\n continue;\n }\n require(userRetrievableTokenMap[record.user][record.token] == 0\n && userRetrievedTokenMap[record.user][record.token] == 0,\n string(abi.encodePacked(\"Can not set twice for user\", record.user, \", token:\", record.token))\n );\n userRetrievableTokenMap[record.user][record.token] += record.amount;\n remainTokenMap[record.token] += record.amount;\n }\n }\n\n function setEndingAt(uint endingAt_) public onlyAdmin {\n require(endingAt_ > 0, \"Invalid ending time\");\n endingAt = endingAt_;\n }\n\n function retrieveTokens(address[] calldata tokens) external {\n require(endingAt > block.timestamp, \"Out of window\");\n for (uint i; i < tokens.length; i++) {\n IERC20Upgradeable token = IERC20Upgradeable(tokens[i]);\n uint amount = userRetrievableTokenMap[msg.sender][tokens[i]];\n if (amount > 0) {\n delete userRetrievableTokenMap[msg.sender][tokens[i]];\n userRetrievedTokenMap[msg.sender][tokens[i]] += amount;\n remainTokenMap[tokens[i]] -= amount;\n token.safeTransfer(msg.sender, amount);\n emit Retrieve(msg.sender, tokens[i], amount);\n }\n }\n }\n\n function transferTokens(IERC20Upgradeable[] calldata tokens_) public onlyAdmin {\n for (uint256 i = 0; i < tokens_.length; i++) {\n IERC20Upgradeable token = tokens_[i];\n token.safeTransfer(msg.sender, token.balanceOf(address(this)));\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n */\n modifier initializer() {\n bool isTopLevelCall = _setInitializedVersion(1);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n * initialization step. This is essential to configure modules that are added through upgrades and that require\n * initialization.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n */\n modifier reinitializer(uint8 version) {\n bool isTopLevelCall = _setInitializedVersion(version);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(version);\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n */\n function _disableInitializers() internal virtual {\n _setInitializedVersion(type(uint8).max);\n }\n\n function _setInitializedVersion(uint8 version) private returns (bool) {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\n // of initializers, because in other contexts the contract may have been reentered.\n if (_initializing) {\n require(\n version == 1 && !AddressUpgradeable.isContract(address(this)),\n \"Initializable: contract is already initialized\"\n );\n return false;\n } else {\n require(_initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n return true;\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n function safeTransfer(\n IERC20Upgradeable token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20Upgradeable token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "@private/shared/libs/Adminable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nabstract contract Adminable {\n event AdminUpdated(address indexed user, address indexed newAdmin);\n\n address public admin;\n\n modifier onlyAdmin() virtual {\n require(msg.sender == admin, \"UNAUTHORIZED\");\n\n _;\n }\n\n function setAdmin(address newAdmin) public virtual onlyAdmin {\n _setAdmin(newAdmin);\n }\n\n function _setAdmin(address newAdmin) internal {\n require(newAdmin != address(0), \"Can not set admin to zero address\");\n admin = newAdmin;\n\n emit AdminUpdated(msg.sender, newAdmin);\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "libraries": { + "": { + "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/solcInputs/41a8600e180880fe88609322a6b2ac21.json b/packages/bonds/deployments/bsc/solcInputs/41a8600e180880fe88609322a6b2ac21.json new file mode 100644 index 0000000..4c1fe6d --- /dev/null +++ b/packages/bonds/deployments/bsc/solcInputs/41a8600e180880fe88609322a6b2ac21.json @@ -0,0 +1,41 @@ +{ + "language": "Solidity", + "sources": { + "solc_0.8/proxy/EIP173Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./Proxy.sol\";\n\ninterface ERC165 {\n function supportsInterface(bytes4 id) external view returns (bool);\n}\n\n///@notice Proxy implementing EIP173 for ownership management\ncontract EIP173Proxy is Proxy {\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\n\n constructor(\n address implementationAddress,\n address ownerAddress,\n bytes memory data\n ) payable {\n _setImplementation(implementationAddress, data);\n _setOwner(ownerAddress);\n }\n\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\n\n function owner() external view returns (address) {\n return _owner();\n }\n\n function supportsInterface(bytes4 id) external view returns (bool) {\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\n return true;\n }\n if (id == 0xFFFFFFFF) {\n return false;\n }\n\n ERC165 implementation;\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\n }\n\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\n // In practise this is unlikely to be an issue.\n try implementation.supportsInterface(id) returns (bool support) {\n return support;\n } catch {\n return false;\n }\n }\n\n function transferOwnership(address newOwner) external onlyOwner {\n _setOwner(newOwner);\n }\n\n function upgradeTo(address newImplementation) external onlyOwner {\n _setImplementation(newImplementation, \"\");\n }\n\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\n _setImplementation(newImplementation, data);\n }\n\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\n\n modifier onlyOwner() {\n require(msg.sender == _owner(), \"NOT_AUTHORIZED\");\n _;\n }\n\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\n\n function _owner() internal view returns (address adminAddress) {\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\n }\n }\n\n function _setOwner(address newOwner) internal {\n address previousOwner = _owner();\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\n }\n emit OwnershipTransferred(previousOwner, newOwner);\n }\n}\n" + }, + "solc_0.8/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// EIP-1967\nabstract contract Proxy {\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\n\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\n\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\n\n receive() external payable virtual {\n revert(\"ETHER_REJECTED\"); // explicit reject by default\n }\n\n fallback() external payable {\n _fallback();\n }\n\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\n\n function _fallback() internal {\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\n calldatacopy(0x0, 0x0, calldatasize())\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\n let retSz := returndatasize()\n returndatacopy(0, 0, retSz)\n switch success\n case 0 {\n revert(0, retSz)\n }\n default {\n return(0, retSz)\n }\n }\n }\n\n function _setImplementation(address newImplementation, bytes memory data) internal {\n address previousImplementation;\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\n }\n\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\n }\n\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\n\n if (data.length > 0) {\n (bool success, ) = newImplementation.delegatecall(data);\n if (!success) {\n assembly {\n // This assembly ensure the revert contains the exact string data\n let returnDataSize := returndatasize()\n returndatacopy(0, 0, returnDataSize)\n revert(0, returnDataSize)\n }\n }\n }\n }\n}\n" + }, + "solc_0.8/proxy/EIP173ProxyWithReceive.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./EIP173Proxy.sol\";\n\n///@notice Proxy implementing EIP173 for ownership management that accept ETH via receive\ncontract EIP173ProxyWithReceive is EIP173Proxy {\n constructor(\n address implementationAddress,\n address ownerAddress,\n bytes memory data\n ) payable EIP173Proxy(implementationAddress, ownerAddress, data) {}\n\n receive() external payable override {}\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 999999 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/.chainId b/packages/bonds/deployments/bsctest/.chainId new file mode 100644 index 0000000..c4fbb1c --- /dev/null +++ b/packages/bonds/deployments/bsctest/.chainId @@ -0,0 +1 @@ +97 \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/.extraMeta/AccidentHandler20220715V3.json b/packages/bonds/deployments/bsctest/.extraMeta/AccidentHandler20220715V3.json new file mode 100644 index 0000000..ed332ea --- /dev/null +++ b/packages/bonds/deployments/bsctest/.extraMeta/AccidentHandler20220715V3.json @@ -0,0 +1,4 @@ +{ + "class": "AccidentHandler20220715V3", + "instance": "AccidentHandler20220715V3" +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/AccidentHandler20220715V3.json b/packages/bonds/deployments/bsctest/AccidentHandler20220715V3.json new file mode 100644 index 0000000..9ab9928 --- /dev/null +++ b/packages/bonds/deployments/bsctest/AccidentHandler20220715V3.json @@ -0,0 +1,527 @@ +{ + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ProxyImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "id", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Retrieve", + "type": "event" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "endingAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "endingAt_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "remainTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrievables", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrieveTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrieved", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "endingAt_", + "type": "uint256" + } + ], + "name": "setEndingAt", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct AccidentHandler20220715V3.Record[]", + "name": "records_", + "type": "tuple[]" + } + ], + "name": "setRecords", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRetrievableTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRetrievedTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementationAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "ownerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "receipt": { + "to": null, + "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "contractAddress": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "transactionIndex": 6, + "gasUsed": "692987", + "logsBloom": "0x00000000040000000000000000010000000000000000000000800000000000000000000800000000000400000000000000000000000004000000000000000000011000000000000000000000000000000001000000000000000200000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000020000000000080000000800000000000000000000000000000000000000600000000000000000000000000000000000008000000000008000000000000040000000000000000000000000000000020000000000000000000000400000000000000000000000000000000000000000000", + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163", + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "logs": [ + { + "transactionIndex": 6, + "blockNumber": 21796345, + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "topics": [ + "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000001a197925bfb0fc07fb6323fd40a9a98485720c6a" + ], + "data": "0x", + "logIndex": 7, + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + }, + { + "transactionIndex": 6, + "blockNumber": 21796345, + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "topics": [ + "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "data": "0x", + "logIndex": 8, + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + }, + { + "transactionIndex": 6, + "blockNumber": 21796345, + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 9, + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + }, + { + "transactionIndex": 6, + "blockNumber": 21796345, + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "data": "0x", + "logIndex": 10, + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + } + ], + "blockNumber": 21796345, + "cumulativeGasUsed": "970069", + "status": 1, + "byzantium": true + }, + "args": [ + "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", + "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "0xcd6dc687000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a600000000000000000000000000000000000000000000000000000000634289d3" + ], + "numDeployments": 1, + "solcInputHash": "41a8600e180880fe88609322a6b2ac21", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/proxy/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/proxy/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n constructor(\\n address implementationAddress,\\n address ownerAddress,\\n bytes memory data\\n ) payable {\\n _setImplementation(implementationAddress, data);\\n _setOwner(ownerAddress);\\n }\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xb9c14a66c8a4eefabca13cc8dd8133c1587909bb1124fa793c50ab46358b63e4\",\"license\":\"MIT\"},\"solc_0.8/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 {\\n revert(0, retSz)\\n }\\n default {\\n return(0, retSz)\\n }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success, ) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x68c8cf1a340a53d31de8ed808bb66d64e83d50b20d80a0b2dff6aba903cebc98\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405162000ccc38038062000ccc8339810160408190526200002691620001fc565b62000032838262000046565b6200003d8262000128565b505050620002fa565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511562000123576000836001600160a01b031683604051620000ca9190620002dc565b600060405180830381855af49150503d806000811462000107576040519150601f19603f3d011682016040523d82523d6000602084013e6200010c565b606091505b505090508062000121573d806000803e806000fd5b505b505050565b60006200014260008051602062000cac8339815191525490565b90508160008051602062000cac83398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80516001600160a01b0381168114620001b257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001ea578181015183820152602001620001d0565b83811115620001215750506000910152565b6000806000606084860312156200021257600080fd5b6200021d846200019a565b92506200022d602085016200019a565b60408501519092506001600160401b03808211156200024b57600080fd5b818601915086601f8301126200026057600080fd5b815181811115620002755762000275620001b7565b604051601f8201601f19908116603f01168101908382118183101715620002a057620002a0620001b7565b81604052828152896020848701011115620002ba57600080fd5b620002cd836020830160208801620001cd565b80955050505050509250925092565b60008251620002f0818460208701620001cd565b9190910192915050565b6109a2806200030a6000396000f3fe60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033", + "execute": { + "methodName": "initialize", + "args": [ + "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + 1665305043 + ] + }, + "implementation": "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Proxy implementing EIP173 for ownership management", + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Implementation.json b/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Implementation.json new file mode 100644 index 0000000..e2d1e94 --- /dev/null +++ b/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Implementation.json @@ -0,0 +1,408 @@ +{ + "address": "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Retrieve", + "type": "event" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "endingAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "endingAt_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "remainTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrievables", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrieveTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "retrieved", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "endingAt_", + "type": "uint256" + } + ], + "name": "setEndingAt", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "internalType": "struct AccidentHandler20220715V3.Record[]", + "name": "records_", + "type": "tuple[]" + } + ], + "name": "setRecords", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRetrievableTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userRetrievedTokenMap", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xcda4799d9f61363b81803a028db38ac1095e62be57c6652e6534cc78203d1713", + "receipt": { + "to": null, + "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "contractAddress": "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", + "transactionIndex": 5, + "gasUsed": "974274", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xfbca26fbae07a54a93f7aa54af46123ce0a2cc65b42bb40c96102ef367a84152", + "transactionHash": "0xcda4799d9f61363b81803a028db38ac1095e62be57c6652e6534cc78203d1713", + "logs": [], + "blockNumber": 21796286, + "cumulativeGasUsed": "2291197", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "c64de78500c453458ed62a1018d284a7", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Retrieve\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endingAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"endingAt_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"remainTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrievables\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrieveTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrieved\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"endingAt_\",\"type\":\"uint256\"}],\"name\":\"setEndingAt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct AccidentHandler20220715V3.Record[]\",\"name\":\"records_\",\"type\":\"tuple[]\"}],\"name\":\"setRecords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userRetrievableTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userRetrievedTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/AccidentHandler20220715V3.sol\":\"AccidentHandler20220715V3\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n function safeTransfer(\\n IERC20Upgradeable token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20Upgradeable token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3e26a49d2fa5ef8338b8a9467c91e54f417cb07e849b1cc0f4ebc4d2a147938e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@private/shared/libs/Adminable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nabstract contract Adminable {\\n event AdminUpdated(address indexed user, address indexed newAdmin);\\n\\n address public admin;\\n\\n modifier onlyAdmin() virtual {\\n require(msg.sender == admin, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n function setAdmin(address newAdmin) public virtual onlyAdmin {\\n _setAdmin(newAdmin);\\n }\\n\\n function _setAdmin(address newAdmin) internal {\\n require(newAdmin != address(0), \\\"Can not set admin to zero address\\\");\\n admin = newAdmin;\\n\\n emit AdminUpdated(msg.sender, newAdmin);\\n }\\n}\\n\",\"keccak256\":\"0xe47c97c0e3edad2d1df3e664376a7bb46e1aaf51b4c4acc73c4a2cfdc747185f\",\"license\":\"GPL-3.0\"},\"contracts/AccidentHandler20220715V3.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\npragma abicoder v2;\\n\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"@private/shared/libs/Adminable.sol\\\";\\n\\n\\ncontract AccidentHandler20220715V3 is Initializable, Adminable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n // [user]: [token]: amount # retrievable\\n mapping(address => mapping(address => uint)) public userRetrievableTokenMap;\\n // [user]: [token]: amount # retrieved\\n mapping(address => mapping(address => uint)) public userRetrievedTokenMap;\\n // [token]: amount # retrievable\\n mapping(address => uint) public remainTokenMap;\\n\\n uint public endingAt;\\n\\n event Retrieve(address user, address token, uint amount);\\n struct Record {\\n address user;\\n address token;\\n uint amount;\\n }\\n\\n function initialize(address admin_, uint endingAt_) public initializer {\\n require(admin_ != address(0), \\\"Can't set admin to zero address\\\");\\n _setAdmin(admin_);\\n setEndingAt(endingAt_);\\n }\\n\\n function retrievables(address[] calldata tokens) external view returns (uint[] memory) {\\n uint[] memory amounts = new uint[](tokens.length);\\n for (uint i; i < tokens.length; i++) {\\n amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]];\\n }\\n return amounts;\\n }\\n\\n function retrieved(address[] calldata tokens) external view returns (uint[] memory) {\\n uint[] memory amounts = new uint[](tokens.length);\\n for (uint i; i < tokens.length; i++) {\\n amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]];\\n }\\n return amounts;\\n }\\n\\n function setRecords(Record[] calldata records_) external onlyAdmin {\\n for (uint i; i < records_.length; i++) {\\n Record calldata record = records_[i];\\n userRetrievableTokenMap[record.user][record.token] += record.amount;\\n remainTokenMap[record.token] += record.amount;\\n }\\n }\\n\\n function setEndingAt(uint endingAt_) public onlyAdmin {\\n require(endingAt_ != 0 && endingAt_ > block.timestamp, \\\"Invalid ending time\\\");\\n endingAt = endingAt_;\\n }\\n\\n function retrieveTokens(address[] calldata tokens) external {\\n require(endingAt > block.timestamp, \\\"Out of window\\\");\\n for (uint i; i < tokens.length; i++) {\\n IERC20Upgradeable token = IERC20Upgradeable(tokens[i]);\\n uint amount = userRetrievableTokenMap[msg.sender][tokens[i]];\\n if (amount > 0) {\\n delete userRetrievableTokenMap[msg.sender][tokens[i]];\\n userRetrievedTokenMap[msg.sender][tokens[i]] += amount;\\n remainTokenMap[tokens[i]] -= amount;\\n token.safeTransfer(msg.sender, amount);\\n emit Retrieve(msg.sender, tokens[i], amount);\\n }\\n }\\n }\\n\\n}\\n\",\"keccak256\":\"0xaec4361f8420d2f9f1986fbba38b3df674e76a2272e50027e203eb66c1167d97\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b506110aa806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80639a22d5a6116100715780639a22d5a61461017d578063c23b498814610190578063cd6dc68714610199578063e797e9ef146101ac578063f1a0d18b146101bf578063f851a440146101df57600080fd5b80632d915022146100b957806336463706146100f75780635ab2fd3214610117578063704b6c021461012c57806376de352d1461013f5780637fa3b3da14610152575b600080fd5b6100e46100c7366004610d26565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61010a610105366004610d59565b610210565b6040516100ee9190610dce565b61012a610125366004610e12565b6102f3565b005b61012a61013a366004610e2b565b610381565b61010a61014d366004610d59565b6103bd565b6100e4610160366004610d26565b600160209081526000928352604080842090915290825290205481565b61012a61018b366004610e46565b610498565b6100e460045481565b61012a6101a7366004610ea9565b6105d7565b61012a6101ba366004610d59565b6106ad565b6100e46101cd366004610e2b565b60036020526000908152604090205481565b6000546101f8906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016100ee565b606060008267ffffffffffffffff81111561022d5761022d610ed3565b604051908082528060200260200182016040528015610256578160200160208202803683370190505b50905060005b838110156102eb573360009081526001602052604081209086868481811061028657610286610ee9565b905060200201602081019061029b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106102ce576102ce610ee9565b6020908102919091010152806102e381610f15565b91505061025c565b509392505050565b6000546201000090046001600160a01b0316331461032c5760405162461bcd60e51b815260040161032390610f30565b60405180910390fd5b801580159061033a57504281115b61037c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420656e64696e672074696d6560681b6044820152606401610323565b600455565b6000546201000090046001600160a01b031633146103b15760405162461bcd60e51b815260040161032390610f30565b6103ba8161093d565b50565b606060008267ffffffffffffffff8111156103da576103da610ed3565b604051908082528060200260200182016040528015610403578160200160208202803683370190505b50905060005b838110156102eb573360009081526002602052604081209086868481811061043357610433610ee9565b90506020020160208101906104489190610e2b565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061047b5761047b610ee9565b60209081029190910101528061049081610f15565b915050610409565b6000546201000090046001600160a01b031633146104c85760405162461bcd60e51b815260040161032390610f30565b60005b818110156105d257368383838181106104e6576104e6610ee9565b606002919091019150506040810135600160006105066020850185610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600083602001602081019061053b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461056a9190610f56565b9091555050604081018035906003906000906105899060208601610e2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546105b89190610f56565b909155508291506105ca905081610f15565b9150506104cb565b505050565b60006105e360016109f2565b905080156105fb576000805461ff0019166101001790555b6001600160a01b0383166106515760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207365742061646d696e20746f207a65726f2061646472657373006044820152606401610323565b61065a8361093d565b610663826102f3565b80156105d2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b42600454116106ee5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f662077696e646f7760981b6044820152606401610323565b60005b818110156105d257600083838381811061070d5761070d610ee9565b90506020020160208101906107229190610e2b565b336000908152600160205260408120919250908186868681811061074857610748610ee9565b905060200201602081019061075d9190610e2b565b6001600160a01b031681526020810191909152604001600020549050801561092857336000908152600160205260408120908686868181106107a1576107a1610ee9565b90506020020160208101906107b69190610e2b565b6001600160a01b03168152602080820192909252604090810160009081208190553381526002909252812082918787878181106107f5576107f5610ee9565b905060200201602081019061080a9190610e2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546108399190610f56565b909155508190506003600087878781811061085657610856610ee9565b905060200201602081019061086b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461089a9190610f6e565b909155506108b490506001600160a01b0383163383610a7f565b7f8bd0db04d7d748ae70a6a244675345c05f70e540f344927714da92f35b2418ce338686868181106108e8576108e8610ee9565b90506020020160208101906108fd9190610e2b565b604080516001600160a01b039384168152929091166020830152810183905260600160405180910390a15b5050808061093590610f15565b9150506106f1565b6001600160a01b03811661099d5760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b6064820152608401610323565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff1615610a39578160ff166001148015610a155750303b155b610a315760405162461bcd60e51b815260040161032390610f85565b506000919050565b60005460ff808416911610610a605760405162461bcd60e51b815260040161032390610f85565b506000805460ff191660ff92909216919091179055600190565b919050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526105d292869291600091610b0f918516908490610b8c565b8051909150156105d25780806020019051810190610b2d9190610fd3565b6105d25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610323565b6060610b9b8484600085610ba5565b90505b9392505050565b606082471015610c065760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610323565b6001600160a01b0385163b610c5d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610323565b600080866001600160a01b03168587604051610c799190611025565b60006040518083038185875af1925050503d8060008114610cb6576040519150601f19603f3d011682016040523d82523d6000602084013e610cbb565b606091505b5091509150610ccb828286610cd6565b979650505050505050565b60608315610ce5575081610b9e565b825115610cf55782518084602001fd5b8160405162461bcd60e51b81526004016103239190611041565b80356001600160a01b0381168114610a7a57600080fd5b60008060408385031215610d3957600080fd5b610d4283610d0f565b9150610d5060208401610d0f565b90509250929050565b60008060208385031215610d6c57600080fd5b823567ffffffffffffffff80821115610d8457600080fd5b818501915085601f830112610d9857600080fd5b813581811115610da757600080fd5b8660208260051b8501011115610dbc57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015610e0657835183529284019291840191600101610dea565b50909695505050505050565b600060208284031215610e2457600080fd5b5035919050565b600060208284031215610e3d57600080fd5b610b9e82610d0f565b60008060208385031215610e5957600080fd5b823567ffffffffffffffff80821115610e7157600080fd5b818501915085601f830112610e8557600080fd5b813581811115610e9457600080fd5b866020606083028501011115610dbc57600080fd5b60008060408385031215610ebc57600080fd5b610ec583610d0f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415610f2957610f29610eff565b5060010190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60008219821115610f6957610f69610eff565b500190565b600082821015610f8057610f80610eff565b500390565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215610fe557600080fd5b81518015158114610b9e57600080fd5b60005b83811015611010578181015183820152602001610ff8565b8381111561101f576000848401525b50505050565b60008251611037818460208701610ff5565b9190910192915050565b6020815260008251806020840152611060816040850160208701610ff5565b601f01601f1916919091016040019291505056fea2646970667358221220b63c1f900c9f3a0830eaf226383d62da42e77d9feb8fe0cdd092528162e1e38264736f6c63430008090033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80639a22d5a6116100715780639a22d5a61461017d578063c23b498814610190578063cd6dc68714610199578063e797e9ef146101ac578063f1a0d18b146101bf578063f851a440146101df57600080fd5b80632d915022146100b957806336463706146100f75780635ab2fd3214610117578063704b6c021461012c57806376de352d1461013f5780637fa3b3da14610152575b600080fd5b6100e46100c7366004610d26565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61010a610105366004610d59565b610210565b6040516100ee9190610dce565b61012a610125366004610e12565b6102f3565b005b61012a61013a366004610e2b565b610381565b61010a61014d366004610d59565b6103bd565b6100e4610160366004610d26565b600160209081526000928352604080842090915290825290205481565b61012a61018b366004610e46565b610498565b6100e460045481565b61012a6101a7366004610ea9565b6105d7565b61012a6101ba366004610d59565b6106ad565b6100e46101cd366004610e2b565b60036020526000908152604090205481565b6000546101f8906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016100ee565b606060008267ffffffffffffffff81111561022d5761022d610ed3565b604051908082528060200260200182016040528015610256578160200160208202803683370190505b50905060005b838110156102eb573360009081526001602052604081209086868481811061028657610286610ee9565b905060200201602081019061029b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106102ce576102ce610ee9565b6020908102919091010152806102e381610f15565b91505061025c565b509392505050565b6000546201000090046001600160a01b0316331461032c5760405162461bcd60e51b815260040161032390610f30565b60405180910390fd5b801580159061033a57504281115b61037c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420656e64696e672074696d6560681b6044820152606401610323565b600455565b6000546201000090046001600160a01b031633146103b15760405162461bcd60e51b815260040161032390610f30565b6103ba8161093d565b50565b606060008267ffffffffffffffff8111156103da576103da610ed3565b604051908082528060200260200182016040528015610403578160200160208202803683370190505b50905060005b838110156102eb573360009081526002602052604081209086868481811061043357610433610ee9565b90506020020160208101906104489190610e2b565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061047b5761047b610ee9565b60209081029190910101528061049081610f15565b915050610409565b6000546201000090046001600160a01b031633146104c85760405162461bcd60e51b815260040161032390610f30565b60005b818110156105d257368383838181106104e6576104e6610ee9565b606002919091019150506040810135600160006105066020850185610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600083602001602081019061053b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461056a9190610f56565b9091555050604081018035906003906000906105899060208601610e2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546105b89190610f56565b909155508291506105ca905081610f15565b9150506104cb565b505050565b60006105e360016109f2565b905080156105fb576000805461ff0019166101001790555b6001600160a01b0383166106515760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207365742061646d696e20746f207a65726f2061646472657373006044820152606401610323565b61065a8361093d565b610663826102f3565b80156105d2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b42600454116106ee5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f662077696e646f7760981b6044820152606401610323565b60005b818110156105d257600083838381811061070d5761070d610ee9565b90506020020160208101906107229190610e2b565b336000908152600160205260408120919250908186868681811061074857610748610ee9565b905060200201602081019061075d9190610e2b565b6001600160a01b031681526020810191909152604001600020549050801561092857336000908152600160205260408120908686868181106107a1576107a1610ee9565b90506020020160208101906107b69190610e2b565b6001600160a01b03168152602080820192909252604090810160009081208190553381526002909252812082918787878181106107f5576107f5610ee9565b905060200201602081019061080a9190610e2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546108399190610f56565b909155508190506003600087878781811061085657610856610ee9565b905060200201602081019061086b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461089a9190610f6e565b909155506108b490506001600160a01b0383163383610a7f565b7f8bd0db04d7d748ae70a6a244675345c05f70e540f344927714da92f35b2418ce338686868181106108e8576108e8610ee9565b90506020020160208101906108fd9190610e2b565b604080516001600160a01b039384168152929091166020830152810183905260600160405180910390a15b5050808061093590610f15565b9150506106f1565b6001600160a01b03811661099d5760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b6064820152608401610323565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff1615610a39578160ff166001148015610a155750303b155b610a315760405162461bcd60e51b815260040161032390610f85565b506000919050565b60005460ff808416911610610a605760405162461bcd60e51b815260040161032390610f85565b506000805460ff191660ff92909216919091179055600190565b919050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526105d292869291600091610b0f918516908490610b8c565b8051909150156105d25780806020019051810190610b2d9190610fd3565b6105d25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610323565b6060610b9b8484600085610ba5565b90505b9392505050565b606082471015610c065760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610323565b6001600160a01b0385163b610c5d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610323565b600080866001600160a01b03168587604051610c799190611025565b60006040518083038185875af1925050503d8060008114610cb6576040519150601f19603f3d011682016040523d82523d6000602084013e610cbb565b606091505b5091509150610ccb828286610cd6565b979650505050505050565b60608315610ce5575081610b9e565b825115610cf55782518084602001fd5b8160405162461bcd60e51b81526004016103239190611041565b80356001600160a01b0381168114610a7a57600080fd5b60008060408385031215610d3957600080fd5b610d4283610d0f565b9150610d5060208401610d0f565b90509250929050565b60008060208385031215610d6c57600080fd5b823567ffffffffffffffff80821115610d8457600080fd5b818501915085601f830112610d9857600080fd5b813581811115610da757600080fd5b8660208260051b8501011115610dbc57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015610e0657835183529284019291840191600101610dea565b50909695505050505050565b600060208284031215610e2457600080fd5b5035919050565b600060208284031215610e3d57600080fd5b610b9e82610d0f565b60008060208385031215610e5957600080fd5b823567ffffffffffffffff80821115610e7157600080fd5b818501915085601f830112610e8557600080fd5b813581811115610e9457600080fd5b866020606083028501011115610dbc57600080fd5b60008060408385031215610ebc57600080fd5b610ec583610d0f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415610f2957610f29610eff565b5060010190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60008219821115610f6957610f69610eff565b500190565b600082821015610f8057610f80610eff565b500390565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215610fe557600080fd5b81518015158114610b9e57600080fd5b60005b83811015611010578181015183820152602001610ff8565b8381111561101f576000848401525b50505050565b60008251611037818460208701610ff5565b9190910192915050565b6020815260008251806020840152611060816040850160208701610ff5565b601f01601f1916919091016040019291505056fea2646970667358221220b63c1f900c9f3a0830eaf226383d62da42e77d9feb8fe0cdd092528162e1e38264736f6c63430008090033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 6, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 9, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 696, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "admin", + "offset": 2, + "slot": "0", + "type": "t_address" + }, + { + "astId": 768, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "userRetrievableTokenMap", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 774, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "userRetrievedTokenMap", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 778, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "remainTokenMap", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 780, + "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", + "label": "endingAt", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Proxy.json b/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Proxy.json new file mode 100644 index 0000000..ebfc9c0 --- /dev/null +++ b/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Proxy.json @@ -0,0 +1,244 @@ +{ + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "implementationAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "ownerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousImplementation", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "ProxyImplementationUpdated", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "id", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "receipt": { + "to": null, + "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "contractAddress": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "transactionIndex": 6, + "gasUsed": "692987", + "logsBloom": "0x00000000040000000000000000010000000000000000000000800000000000000000000800000000000400000000000000000000000004000000000000000000011000000000000000000000000000000001000000000000000200000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000020000000000080000000800000000000000000000000000000000000000600000000000000000000000000000000000008000000000008000000000000040000000000000000000000000000000020000000000000000000000400000000000000000000000000000000000000000000", + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163", + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "logs": [ + { + "transactionIndex": 6, + "blockNumber": 21796345, + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "topics": [ + "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000001a197925bfb0fc07fb6323fd40a9a98485720c6a" + ], + "data": "0x", + "logIndex": 7, + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + }, + { + "transactionIndex": 6, + "blockNumber": 21796345, + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "topics": [ + "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "data": "0x", + "logIndex": 8, + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + }, + { + "transactionIndex": 6, + "blockNumber": 21796345, + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 9, + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + }, + { + "transactionIndex": 6, + "blockNumber": 21796345, + "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "data": "0x", + "logIndex": 10, + "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + } + ], + "blockNumber": 21796345, + "cumulativeGasUsed": "970069", + "status": 1, + "byzantium": true + }, + "args": [ + "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", + "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "0xcd6dc687000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a600000000000000000000000000000000000000000000000000000000634289d3" + ], + "numDeployments": 1, + "solcInputHash": "41a8600e180880fe88609322a6b2ac21", + "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/proxy/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/proxy/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n constructor(\\n address implementationAddress,\\n address ownerAddress,\\n bytes memory data\\n ) payable {\\n _setImplementation(implementationAddress, data);\\n _setOwner(ownerAddress);\\n }\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xb9c14a66c8a4eefabca13cc8dd8133c1587909bb1124fa793c50ab46358b63e4\",\"license\":\"MIT\"},\"solc_0.8/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 {\\n revert(0, retSz)\\n }\\n default {\\n return(0, retSz)\\n }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success, ) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x68c8cf1a340a53d31de8ed808bb66d64e83d50b20d80a0b2dff6aba903cebc98\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405260405162000ccc38038062000ccc8339810160408190526200002691620001fc565b62000032838262000046565b6200003d8262000128565b505050620002fa565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511562000123576000836001600160a01b031683604051620000ca9190620002dc565b600060405180830381855af49150503d806000811462000107576040519150601f19603f3d011682016040523d82523d6000602084013e6200010c565b606091505b505090508062000121573d806000803e806000fd5b505b505050565b60006200014260008051602062000cac8339815191525490565b90508160008051602062000cac83398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80516001600160a01b0381168114620001b257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001ea578181015183820152602001620001d0565b83811115620001215750506000910152565b6000806000606084860312156200021257600080fd5b6200021d846200019a565b92506200022d602085016200019a565b60408501519092506001600160401b03808211156200024b57600080fd5b818601915086601f8301126200026057600080fd5b815181811115620002755762000275620001b7565b604051601f8201601f19908116603f01168101908382118183101715620002a057620002a0620001b7565b81604052828152896020848701011115620002ba57600080fd5b620002cd836020830160208801620001cd565b80955050505050509250925092565b60008251620002f0818460208701620001cd565b9190910192915050565b6109a2806200030a6000396000f3fe60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "Proxy implementing EIP173 for ownership management", + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/solcInputs/41a8600e180880fe88609322a6b2ac21.json b/packages/bonds/deployments/bsctest/solcInputs/41a8600e180880fe88609322a6b2ac21.json new file mode 100644 index 0000000..4c1fe6d --- /dev/null +++ b/packages/bonds/deployments/bsctest/solcInputs/41a8600e180880fe88609322a6b2ac21.json @@ -0,0 +1,41 @@ +{ + "language": "Solidity", + "sources": { + "solc_0.8/proxy/EIP173Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./Proxy.sol\";\n\ninterface ERC165 {\n function supportsInterface(bytes4 id) external view returns (bool);\n}\n\n///@notice Proxy implementing EIP173 for ownership management\ncontract EIP173Proxy is Proxy {\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\n\n constructor(\n address implementationAddress,\n address ownerAddress,\n bytes memory data\n ) payable {\n _setImplementation(implementationAddress, data);\n _setOwner(ownerAddress);\n }\n\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\n\n function owner() external view returns (address) {\n return _owner();\n }\n\n function supportsInterface(bytes4 id) external view returns (bool) {\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\n return true;\n }\n if (id == 0xFFFFFFFF) {\n return false;\n }\n\n ERC165 implementation;\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\n }\n\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\n // In practise this is unlikely to be an issue.\n try implementation.supportsInterface(id) returns (bool support) {\n return support;\n } catch {\n return false;\n }\n }\n\n function transferOwnership(address newOwner) external onlyOwner {\n _setOwner(newOwner);\n }\n\n function upgradeTo(address newImplementation) external onlyOwner {\n _setImplementation(newImplementation, \"\");\n }\n\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\n _setImplementation(newImplementation, data);\n }\n\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\n\n modifier onlyOwner() {\n require(msg.sender == _owner(), \"NOT_AUTHORIZED\");\n _;\n }\n\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\n\n function _owner() internal view returns (address adminAddress) {\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\n }\n }\n\n function _setOwner(address newOwner) internal {\n address previousOwner = _owner();\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\n }\n emit OwnershipTransferred(previousOwner, newOwner);\n }\n}\n" + }, + "solc_0.8/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// EIP-1967\nabstract contract Proxy {\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\n\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\n\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\n\n receive() external payable virtual {\n revert(\"ETHER_REJECTED\"); // explicit reject by default\n }\n\n fallback() external payable {\n _fallback();\n }\n\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\n\n function _fallback() internal {\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\n calldatacopy(0x0, 0x0, calldatasize())\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\n let retSz := returndatasize()\n returndatacopy(0, 0, retSz)\n switch success\n case 0 {\n revert(0, retSz)\n }\n default {\n return(0, retSz)\n }\n }\n }\n\n function _setImplementation(address newImplementation, bytes memory data) internal {\n address previousImplementation;\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\n }\n\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\n }\n\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\n\n if (data.length > 0) {\n (bool success, ) = newImplementation.delegatecall(data);\n if (!success) {\n assembly {\n // This assembly ensure the revert contains the exact string data\n let returnDataSize := returndatasize()\n returndatacopy(0, 0, returnDataSize)\n revert(0, returnDataSize)\n }\n }\n }\n }\n}\n" + }, + "solc_0.8/proxy/EIP173ProxyWithReceive.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./EIP173Proxy.sol\";\n\n///@notice Proxy implementing EIP173 for ownership management that accept ETH via receive\ncontract EIP173ProxyWithReceive is EIP173Proxy {\n constructor(\n address implementationAddress,\n address ownerAddress,\n bytes memory data\n ) payable EIP173Proxy(implementationAddress, ownerAddress, data) {}\n\n receive() external payable override {}\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 999999 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/solcInputs/c64de78500c453458ed62a1018d284a7.json b/packages/bonds/deployments/bsctest/solcInputs/c64de78500c453458ed62a1018d284a7.json new file mode 100644 index 0000000..aede973 --- /dev/null +++ b/packages/bonds/deployments/bsctest/solcInputs/c64de78500c453458ed62a1018d284a7.json @@ -0,0 +1,55 @@ +{ + "language": "Solidity", + "sources": { + "contracts/AccidentHandler20220715V3.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\npragma abicoder v2;\n\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\nimport \"@private/shared/libs/Adminable.sol\";\n\n\ncontract AccidentHandler20220715V3 is Initializable, Adminable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n // [user]: [token]: amount # retrievable\n mapping(address => mapping(address => uint)) public userRetrievableTokenMap;\n // [user]: [token]: amount # retrieved\n mapping(address => mapping(address => uint)) public userRetrievedTokenMap;\n // [token]: amount # retrievable\n mapping(address => uint) public remainTokenMap;\n\n uint public endingAt;\n\n event Retrieve(address user, address token, uint amount);\n struct Record {\n address user;\n address token;\n uint amount;\n }\n\n function initialize(address admin_, uint endingAt_) public initializer {\n require(admin_ != address(0), \"Can't set admin to zero address\");\n _setAdmin(admin_);\n setEndingAt(endingAt_);\n }\n\n function retrievables(address[] calldata tokens) external view returns (uint[] memory) {\n uint[] memory amounts = new uint[](tokens.length);\n for (uint i; i < tokens.length; i++) {\n amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]];\n }\n return amounts;\n }\n\n function retrieved(address[] calldata tokens) external view returns (uint[] memory) {\n uint[] memory amounts = new uint[](tokens.length);\n for (uint i; i < tokens.length; i++) {\n amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]];\n }\n return amounts;\n }\n\n function setRecords(Record[] calldata records_) external onlyAdmin {\n for (uint i; i < records_.length; i++) {\n Record calldata record = records_[i];\n userRetrievableTokenMap[record.user][record.token] += record.amount;\n remainTokenMap[record.token] += record.amount;\n }\n }\n\n function setEndingAt(uint endingAt_) public onlyAdmin {\n require(endingAt_ != 0 && endingAt_ > block.timestamp, \"Invalid ending time\");\n endingAt = endingAt_;\n }\n\n function retrieveTokens(address[] calldata tokens) external {\n require(endingAt > block.timestamp, \"Out of window\");\n for (uint i; i < tokens.length; i++) {\n IERC20Upgradeable token = IERC20Upgradeable(tokens[i]);\n uint amount = userRetrievableTokenMap[msg.sender][tokens[i]];\n if (amount > 0) {\n delete userRetrievableTokenMap[msg.sender][tokens[i]];\n userRetrievedTokenMap[msg.sender][tokens[i]] += amount;\n remainTokenMap[tokens[i]] -= amount;\n token.safeTransfer(msg.sender, amount);\n emit Retrieve(msg.sender, tokens[i], amount);\n }\n }\n }\n\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n */\n modifier initializer() {\n bool isTopLevelCall = _setInitializedVersion(1);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n * initialization step. This is essential to configure modules that are added through upgrades and that require\n * initialization.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n */\n modifier reinitializer(uint8 version) {\n bool isTopLevelCall = _setInitializedVersion(version);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(version);\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n */\n function _disableInitializers() internal virtual {\n _setInitializedVersion(type(uint8).max);\n }\n\n function _setInitializedVersion(uint8 version) private returns (bool) {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\n // of initializers, because in other contexts the contract may have been reentered.\n if (_initializing) {\n require(\n version == 1 && !AddressUpgradeable.isContract(address(this)),\n \"Initializable: contract is already initialized\"\n );\n return false;\n } else {\n require(_initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n return true;\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n function safeTransfer(\n IERC20Upgradeable token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20Upgradeable token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "@private/shared/libs/Adminable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nabstract contract Adminable {\n event AdminUpdated(address indexed user, address indexed newAdmin);\n\n address public admin;\n\n modifier onlyAdmin() virtual {\n require(msg.sender == admin, \"UNAUTHORIZED\");\n\n _;\n }\n\n function setAdmin(address newAdmin) public virtual onlyAdmin {\n _setAdmin(newAdmin);\n }\n\n function _setAdmin(address newAdmin) internal {\n require(newAdmin != address(0), \"Can not set admin to zero address\");\n admin = newAdmin;\n\n emit AdminUpdated(msg.sender, newAdmin);\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "libraries": { + "": { + "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/hardhat.config.ts b/packages/bonds/hardhat.config.ts new file mode 100644 index 0000000..4433006 --- /dev/null +++ b/packages/bonds/hardhat.config.ts @@ -0,0 +1,207 @@ +// eslint-disable node/no-extraneous-import +import * as dotenv from 'dotenv' + +import { HardhatUserConfig, task } from 'hardhat/config' +import '@nomiclabs/hardhat-etherscan' +import '@nomiclabs/hardhat-waffle' +import '@typechain/hardhat' +import 'hardhat-gas-reporter' +import 'solidity-coverage' +import '@nomiclabs/hardhat-solhint' +import '@openzeppelin/hardhat-upgrades' +import 'hardhat-abi-exporter' +import 'hardhat-contract-sizer' +import 'hardhat-watcher' +import 'solidity-docgen' +import 'hardhat-deploy' +import { removeConsoleLog } from 'hardhat-preprocessor' +import { useLogger } from './scripts/utils' +import * as path from 'path' +import * as fs from 'fs' +import axios from 'axios' +import * as ethers from 'ethers' +import { resolveEtherscanApiKey } from '@nomiclabs/hardhat-etherscan/dist/src/resolveEtherscanApiKey' +import { getEtherscanEndpoints } from '@nomiclabs/hardhat-etherscan/dist/src/network/prober' +import { chainConfig } from '@nomiclabs/hardhat-etherscan/dist/src/ChainConfig' +import _ from 'lodash' +import { readFile } from 'fs/promises' + +dotenv.config() + +const logger = useLogger(__filename) +// https://hardhat.org/guides/create-task.html +task('accounts', 'Prints the list of accounts', async (taskArgs, hre) => { + const accounts = await hre.ethers.getSigners() + + for (const account of accounts) { + console.log(account.address) + } +}) +// You need to export an object to set up your config +// Go to https://hardhat.org/config/ to learn more + +const config: HardhatUserConfig = { + solidity: { + version: '0.8.9', + settings: { + optimizer: { + enabled: true, + }, + }, + }, + // Named accounts for plugin `hardhat-deploy` + namedAccounts: { + deployer: 0, + }, + docgen: { + pages: 'files', + outputDir: './docs', + }, + networks: { + hardhat: { + // for CakePool + allowUnlimitedContractSize: true, + chainId: 30097, + ...(process.env.FORK_ENABLED === 'on' + ? { + chainId: process.env.FORK_CHAIN_ID ? parseInt(process.env.FORK_CHAIN_ID) : 30097, + forking: { + url: process.env.FORK_URL!, + blockNumber: parseInt(process.env.FORK_BLOCK_NUMBER!), + }, + accounts: [ + { + privateKey: process.env.FORK_KEY!, + balance: ethers.utils.parseEther('1000').toString(), + }, + ], + } + : {}), + }, + bsctest: { + url: 'https://data-seed-prebsc-1-s3.binance.org:8545', + // url: 'https://data-seed-prebsc-1-s1.binance.org:8545/', + chainId: 97, + accounts: [process.env.KEY_BSC_TEST!], + // for hardhat-eploy + verify: { + etherscan: { + apiKey: process.env.BSCSCAN_TEST_KEY, + }, + }, + }, + bsc: { + url: 'https://bsc-dataseed.binance.org/', + chainId: 56, + accounts: [process.env.KEY_BSC_MAINNET!], + // for hardhat-eploy + verify: { + etherscan: { + apiKey: process.env.BSCSCAN_KEY, + }, + }, + }, + }, + paths: { + sources: './contracts', + tests: './test', + cache: './cache', + artifacts: './artifacts', + }, + gasReporter: { + enabled: Boolean(process.env.REPORT_GAS), + currency: 'USD', + token: 'BNB', + gasPriceApi: 'https://api.bscscan.com/api?module=proxy&action=eth_gasPrice', + coinmarketcap: process.env.COIN_MARKETCAP_API_KEY, + }, + watcher: { + compile: { + tasks: ['compile'], + }, + test: { + tasks: ['test'], + }, + }, + abiExporter: { + path: './data/abi', + clear: true, + flat: false, + // runOnCompile: true, + pretty: true, + }, + etherscan: { + // for hardhat-verify + apiKey: { + bsc: process.env.BSCSCAN_KEY!, + bscTestnet: process.env.BSCSCAN_TEST_KEY!, + mainnet: process.env.ETHERSCAN_API_KEY!, + }, + customChains: [], + }, + preprocess: { + eachLine: removeConsoleLog((hre) => !['hardhat', 'local'].includes(hre.network.name)), + }, +} + +export default config + +task('verify:duet', 'Verifies contract on Etherscan(Duet customized)', async (taskArgs, hre) => { + const deploymentsPath = path.resolve(__dirname, 'deployments', hre.network.name) + logger.info('deploymentsPath', deploymentsPath) + const networkName = hre.network.name === 'bsctest' ? 'bscTestnet' : hre.network.name + const apiKey = resolveEtherscanApiKey(config.etherscan?.apiKey, networkName) + const etherscanEndpoint = await getEtherscanEndpoints( + hre.network.provider, + networkName, + chainConfig, + config.etherscan?.customChains ?? [], + ) + for (const deploymentFile of fs.readdirSync(deploymentsPath)) { + if (deploymentFile.startsWith('.') || !deploymentFile.endsWith('.json')) { + continue + } + const deployment = require(path.resolve(deploymentsPath, deploymentFile)) + const address = deployment.address + if (!address) { + logger.warn(`No address found in deployment file ${deploymentFile}`) + continue + } + const contract = Object.entries(JSON.parse(deployment.metadata).settings.compilationTarget)[0].join(':') + + logger.info('metadataString', contract) + if (deployment?.userdoc?.notice === 'Proxy implementing EIP173 for ownership management') { + logger.warn( + `EIP173 Proxy found in deployment file ${deploymentFile} (${deployment.address}), skipped, it generated by hardhat-deploy, run "npx hardhat --network ${hre.network.name} etherscan-verify"`, + ) + continue + } + + const ret = await axios.get( + `${_.trim(etherscanEndpoint.urls.apiURL, '/')}?module=contract&action=getabi&address=${address}&apikey=${apiKey}`, + ) + + if (ret.data.message === 'OK') { + logger.info(`already verified: ${deploymentFile} - ${address}`) + continue + } + logger.info(`verifying ${deploymentFile} - ${address}`) + const constructorArguments: string[] = deployment.args ?? [] + try { + await hre.run('verify:verify', { + address, + contract, + constructorArguments, + }) + logger.info(`verified ${deploymentFile} - ${address}`) + } catch (e) { + logger.error(`verify failed: ${deploymentFile} - ${address}`, e) + } + } +}) + +task('data:import', 'Import init data', async (_taskArgs, hre) => { + const data = JSON.parse(`${await readFile(path.resolve(__dirname, 'data.json'))}`) + const { deployer } = await hre.getNamedAccounts() + console.info(await hre.deployments.execute('AccidentHandler20220715V3', { from: deployer }, 'setRecords', data)) +}) diff --git a/packages/bonds/package.json b/packages/bonds/package.json new file mode 100644 index 0000000..99f9822 --- /dev/null +++ b/packages/bonds/package.json @@ -0,0 +1,37 @@ +{ + "name": "bonds", + "description": "Duet bonds", + "main": "index.js", + "version": "1.0.0", + "license": "GPL-3.0", + "private": true, + "duet": { + "sdk": true + }, + "scripts": { + "compile": "npx hardhat compile", + "compile:watch": "npx hardhat watch compile", + "clean": "rm -rf artifacts && rm -rf cache && rm -rf coverage && rm -rf typechain", + "deploy:bsc": "npx hardhat deploy --network bsc && ts-node -T ./scripts/clean-solc-inputs.ts", + "deploy:bsctest": "npx hardhat deploy --network bsctest && ts-node -T ./scripts/clean-solc-inputs.ts", + "deploy:local": "npx hardhat deploy --network local", + "verify:bsc": "npx hardhat --network bsc etherscan-verify && npx hardhat --network bsc verify:duet", + "verify:bsctest": "npx hardhat --network bsctest etherscan-verify && npx hardhat --network bsctest verify:duet", + "data:import": "npx hardhat --network bsc data:import", + "abi": "npx hardhat export-abi", + "hardhat": "npx hardhat", + "hint": "npx hardhat check", + "test": "REPORT_GAS=true npx hardhat test", + "test:node": "npx hardhat node", + "test:watch": "npx hardhat watch test", + "test:coverage": "npx hardhat coverage", + "test:size-contracts": "npx hardhat size-contracts", + "docgen": "rm -rf ./docs && npx hardhat docgen", + "prettier": "prettier --write --cache --config ../../.prettierrc --ignore-path ../../.prettierignore --no-error-on-unmatched-pattern 'contracts/**/*.sol' **/*.js **/*.ts **/*.json **/*.yml **/*.yaml", + "pre-commit": "pnpm run prettier" + }, + "devDependencies": { + "@private/shared": "workspace:*", + "axios": "^0.27.2" + } +} diff --git a/packages/bonds/scripts/clean-solc-inputs.ts b/packages/bonds/scripts/clean-solc-inputs.ts new file mode 100644 index 0000000..f11bb4f --- /dev/null +++ b/packages/bonds/scripts/clean-solc-inputs.ts @@ -0,0 +1,33 @@ +import * as path from 'path' +import * as fs from 'fs' +import { useLogger } from './utils' +import { uniq } from 'lodash' + +const logger = useLogger(__filename) +logger.info('Cleaning unused solc input files...') +for (const network of ['bsc', 'bsctest']) { + let solcInputsInUsed: string[] = [] + const dir = path.resolve(__dirname, '../', 'deployments', network) + logger.info(`Processing dir: ${dir}`) + if (!fs.existsSync(dir)) continue + for (const fileName of fs.readdirSync(dir)) { + if (!fileName.endsWith('.json')) { + logger.info('[', network, ']', 'Ignored file/dir:', fileName) + continue + } + const deployment = require(path.resolve(dir, fileName)) + solcInputsInUsed.push(deployment.solcInputHash) + // path.resolve(__dirname, '../', 'deployments', network) + } + solcInputsInUsed = uniq(solcInputsInUsed) + logger.info(network, 'solcInputsInUsed', solcInputsInUsed.join(',')) + + for (const solcFile of fs.readdirSync(path.resolve(dir, 'solcInputs'))) { + const hash = solcFile.substring(0, solcFile.length - '.json'.length) + if (!solcInputsInUsed.includes(hash)) { + const solcFullPath = path.resolve(dir, 'solcInputs', solcFile) + logger.warn('[', network, ']', 'Removing', solcFile) + fs.rmSync(solcFullPath) + } + } +} diff --git a/packages/bonds/scripts/compensasion.ts b/packages/bonds/scripts/compensasion.ts new file mode 100644 index 0000000..5437fe0 --- /dev/null +++ b/packages/bonds/scripts/compensasion.ts @@ -0,0 +1,7 @@ +export const tokens = { + BUSD: '0xe9e7cea3dedca5984780bafc599bd69add087d56', + 'dWTI-BUSD': '0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d', + 'dXAU-BUSD': '0x95ca57ff396864c25520bc97deaae978daaf73f3', + 'dTMC-BUSD': '0xf048897b35963aaed1a241512d26540c7ec42a60', + 'DUET-CAKE': '0xbdf0aa1d1985caa357a6ac6661d838da8691c569', +} diff --git a/packages/bonds/scripts/tsconfig.json b/packages/bonds/scripts/tsconfig.json new file mode 100644 index 0000000..d818840 --- /dev/null +++ b/packages/bonds/scripts/tsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "moduleResolution": "node", + "target": "ES2021", + "module": "commonjs", + "strict": true, + "baseUrl": "./" + } +} diff --git a/packages/bonds/scripts/utils.ts b/packages/bonds/scripts/utils.ts new file mode 100644 index 0000000..70630ac --- /dev/null +++ b/packages/bonds/scripts/utils.ts @@ -0,0 +1,69 @@ +import * as path from 'path' +const chalk = require('chalk') +const moment = require('moment') + +const repoBasePath = path.resolve(path.dirname(path.join(__dirname, '/../../../../'))) + +function getCallerLine() { + return new Error().stack!.split('\n')[4].split(':')[1] +} + +function getCallerFile() { + return new Error().stack!.split('\n')[4].split(':')[0].split('(')[1] +} + +export function useLogger(prefix: string) { + if (prefix.startsWith(repoBasePath)) { + prefix = path.basename(prefix) + } + const prefixStr = () => { + const callerFileName = getCallerFile() + const timePrefix = chalk.gray(`[${moment().format('YYYY-MM-DD HH:mm:ss')}]`) + + let processedPrefix = prefix + if (path.basename(callerFileName) !== processedPrefix) { + processedPrefix = `${processedPrefix}@${path.basename(callerFileName)}` + } + processedPrefix = `${timePrefix} ${processedPrefix}` + return `${chalk.cyanBright(chalk.bold(`${processedPrefix}:${getCallerLine()}`))}: ` + } + return { + ...console, + assert: (value: unknown, message?: string, ...optionalParams: unknown[]) => { + return console.assert(value, `${prefixStr()}${message}`, ...optionalParams) + }, + count: (label?: string): void => { + return console.count(`${prefixStr()}${label}`) + }, + countReset: (label?: string): void => { + return console.count(`${prefixStr()}${label}`) + }, + + ...Object.fromEntries( + ['debug', 'error', 'info', 'log', 'warn', 'trace'].map((level) => { + return [ + level, + (message?: any, ...optionalParams: any[]): void => { + const levelWrapper = level === 'error' ? chalk.redBright : level === 'warn' ? chalk.yellowBright : null + return console[level as 'debug' | 'error' | 'info' | 'log' | 'warn' | 'trace']( + prefixStr(), + chalk.bold(levelWrapper ? levelWrapper(`[${level}]`) : `[${level}]`), + message, + ...optionalParams, + ) + }, + ] + }), + ), + + time: (label?: string): void => { + return console.time(`${prefixStr()}${label}`) + }, + timeEnd: (label?: string): void => { + return console.timeEnd(`${prefixStr()}${label}`) + }, + timeLog: (label?: string): void => { + return console.timeLog(`${prefixStr()}${label}`) + }, + } +} diff --git a/packages/bonds/test/AccidentHandler20220715.test.ts b/packages/bonds/test/AccidentHandler20220715.test.ts new file mode 100644 index 0000000..aa47cd3 --- /dev/null +++ b/packages/bonds/test/AccidentHandler20220715.test.ts @@ -0,0 +1,75 @@ +import { expect, use } from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { ethers } from 'hardhat' +import { AccidentHandler20220715V3, MockERC20 } from '../typechain' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { BigNumber } from 'ethers' + +use(chaiAsPromised) + +describe('AccidentHandler20220715', function () { + let minter: SignerWithAddress + let handler: AccidentHandler20220715V3 + let token: MockERC20 + let user: SignerWithAddress + let timestamp: number + + before(async () => { + ;[minter, user] = await ethers.getSigners() + timestamp = Math.round(Date.now() / 1000) + + const AccidentHandler20220715V3 = await ethers.getContractFactory('AccidentHandler20220715V3') + handler = await AccidentHandler20220715V3.connect(minter).deploy() + + await handler.initialize(minter.address, timestamp + 5 * 60) + + const MockERC20 = await ethers.getContractFactory('MockERC20') + token = await MockERC20.connect(minter).deploy('MockedToken', 'dMT', 10000, 18) + }) + + it('should able to get/set ending time', async () => { + expect(await handler.endingAt()).to.eq(timestamp + 5 * 60) + await handler.setEndingAt(timestamp + 10 * 60) + expect(await handler.endingAt()).to.eq(timestamp + 10 * 60) + }) + + it('should work with correct balance liquidation', async () => { + expect(await handler.remainTokenMap(token.address)).to.eq(0) + expect(await handler.userRetrievableTokenMap(user.address, token.address)).to.eq(0) + expect(await handler.userRetrievedTokenMap(user.address, token.address)).to.eq(0) + expect(await handler.connect(user).retrievables([token.address])).to.deep.eq([BigNumber.from(0)]) + expect(await handler.connect(user).retrieved([token.address])).to.deep.eq([BigNumber.from(0)]) + expect(await token.balanceOf(handler.address)).to.eq(0) + expect(await token.balanceOf(user.address)).to.eq(0) + + await token.mint(handler.address, 10000) + expect(await handler.remainTokenMap(token.address)).to.eq(0) + expect(await handler.userRetrievableTokenMap(user.address, token.address)).to.eq(0) + expect(await handler.userRetrievedTokenMap(user.address, token.address)).to.eq(0) + expect(await handler.connect(user).retrievables([token.address])).to.deep.eq([BigNumber.from(0)]) + expect(await handler.connect(user).retrieved([token.address])).to.deep.eq([BigNumber.from(0)]) + expect(await token.balanceOf(handler.address)).to.eq(10000) + expect(await token.balanceOf(user.address)).to.eq(0) + + await handler.setRecords([ + { user: user.address, token: token.address, amount: 3000 }, + { user: user.address, token: token.address, amount: 7000 }, + ]) + expect(await handler.remainTokenMap(token.address)).to.eq(10000) + expect(await handler.userRetrievableTokenMap(user.address, token.address)).to.eq(10000) + expect(await handler.userRetrievedTokenMap(user.address, token.address)).to.eq(0) + expect(await handler.connect(user).retrievables([token.address])).to.deep.eq([BigNumber.from(10000)]) + expect(await handler.connect(user).retrieved([token.address])).to.deep.eq([BigNumber.from(0)]) + expect(await token.balanceOf(handler.address)).to.eq(10000) + expect(await token.balanceOf(user.address)).to.eq(0) + + await handler.connect(user).retrieveTokens([token.address]) + expect(await handler.remainTokenMap(token.address)).to.eq(0) + expect(await handler.userRetrievableTokenMap(user.address, token.address)).to.eq(0) + expect(await handler.userRetrievedTokenMap(user.address, token.address)).to.eq(10000) + expect(await handler.connect(user).retrievables([token.address])).to.deep.eq([BigNumber.from(0)]) + expect(await handler.connect(user).retrieved([token.address])).to.deep.eq([BigNumber.from(10000)]) + expect(await token.balanceOf(handler.address)).to.eq(0) + expect(await token.balanceOf(user.address)).to.eq(10000) + }) +}) diff --git a/packages/bonds/tsconfig.json b/packages/bonds/tsconfig.json new file mode 100644 index 0000000..1ac48b6 --- /dev/null +++ b/packages/bonds/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "outDir": "dist", + "declaration": true, + "typeRoots": ["./types/", "./node_modules/@types"], + "types": ["node"] + }, + "include": ["./deploy", "./scripts", "./test", "./typechain", "./types"], + "files": ["./hardhat.config.ts"] +} diff --git a/packages/bonds/types/hardhat-deploy.ts b/packages/bonds/types/hardhat-deploy.ts new file mode 100644 index 0000000..10fccc5 --- /dev/null +++ b/packages/bonds/types/hardhat-deploy.ts @@ -0,0 +1,34 @@ +import { Address, DeploymentsExtension } from 'hardhat-deploy/types' +import { EthereumProvider } from 'hardhat/types' + +export interface HardhatDeployRuntimeEnvironment { + deployments: DeploymentsExtension + getNamedAccounts: () => Promise<{ + [name: string]: Address + }> + getUnnamedAccounts: () => Promise + companionNetworks: { + [name: string]: { + deployments: DeploymentsExtension + getNamedAccounts: () => Promise<{ + [name: string]: Address + }> + getUnnamedAccounts: () => Promise + getChainId(): Promise + provider: EthereumProvider + } + } + + getChainId(): Promise +} + +export interface HardhatDeployNetwork { + live: boolean + saveDeployments: boolean + tags: Record + deploy: string[] + companionNetworks: { [name: string]: string } + verify?: { etherscan?: { apiKey?: string; apiUrl?: string } } + zksync?: boolean + autoImpersonate?: boolean +} diff --git a/packages/bonds/types/openzeppelin.d.ts b/packages/bonds/types/openzeppelin.d.ts new file mode 100644 index 0000000..d117f30 --- /dev/null +++ b/packages/bonds/types/openzeppelin.d.ts @@ -0,0 +1 @@ +declare module '@openzeppelin/test-helpers' From 97d579021f4248460d9ac248d646347a3339de3b Mon Sep 17 00:00:00 2001 From: davidduet Date: Wed, 2 Nov 2022 03:31:17 +0800 Subject: [PATCH 2/6] feat(bonds): add discount bonds --- .../contracts/AccidentHandler20220715V3.sol | 95 -- packages/bonds/contracts/BondFactory.sol | 161 +++ packages/bonds/contracts/DiscountBond.sol | 190 ++- packages/bonds/contracts/interfaces/IBond.sol | 28 + .../contracts/interfaces/IBondFactory.sol | 8 + packages/bonds/contracts/libs/Adminable.sol | 25 + .../libs/DuetTransparentUpgradeableProxy.sol | 17 + packages/bonds/deploy/001_deploy-handler.ts | 158 --- .../bonds/deploy/001_deploy_proxyForVerify.ts | 33 + .../bonds/deploy/002_deploy_bondFactory.ts | 45 + .../deploy/003_deploy_bondImplementation.ts | 52 + packages/bonds/deployments/bsc/.chainId | 1 - .../.extraMeta/AccidentHandler20220715V3.json | 4 - .../bsc/AccidentHandler20220715V3.json | 540 --------- ...identHandler20220715V3_Implementation.json | 421 ------- .../bsc/AccidentHandler20220715V3_Proxy.json | 244 ---- .../123cc147802b234c976c6c4db54070fc.json | 55 - .../41a8600e180880fe88609322a6b2ac21.json | 41 - .../.extraMeta/AccidentHandler20220715V3.json | 4 - .../bsctest/.extraMeta/BondFactory.json | 4 + .../bsctest/.extraMeta/DiscountBond.json | 4 + .../DuetTransparentUpgradeableProxy.json | 4 + ...identHandler20220715V3_Implementation.json | 408 ------- ...andler20220715V3.json => BondFactory.json} | 528 ++++++-- .../bsctest/BondFactory_Implementation.json | 762 ++++++++++++ ...15V3_Proxy.json => BondFactory_Proxy.json} | 83 +- .../deployments/bsctest/DiscountBond.json | 1074 +++++++++++++++++ .../DuetTransparentUpgradeableProxy.json | 231 ++++ .../21f9402e2ca5f3597c1386289d997b81.json | 106 ++ .../86b5d7bad88174195e885f97b1fed94c.json | 106 ++ .../8ad23f9bb37bd1e3765ac943d46d8a69.json | 106 ++ .../c64de78500c453458ed62a1018d284a7.json | 55 - packages/bonds/package.json | 4 +- packages/bonds/scripts/compensasion.ts | 7 - 34 files changed, 3379 insertions(+), 2225 deletions(-) delete mode 100644 packages/bonds/contracts/AccidentHandler20220715V3.sol create mode 100644 packages/bonds/contracts/BondFactory.sol create mode 100644 packages/bonds/contracts/interfaces/IBond.sol create mode 100644 packages/bonds/contracts/interfaces/IBondFactory.sol create mode 100644 packages/bonds/contracts/libs/Adminable.sol create mode 100644 packages/bonds/contracts/libs/DuetTransparentUpgradeableProxy.sol delete mode 100644 packages/bonds/deploy/001_deploy-handler.ts create mode 100644 packages/bonds/deploy/001_deploy_proxyForVerify.ts create mode 100644 packages/bonds/deploy/002_deploy_bondFactory.ts create mode 100644 packages/bonds/deploy/003_deploy_bondImplementation.ts delete mode 100644 packages/bonds/deployments/bsc/.chainId delete mode 100644 packages/bonds/deployments/bsc/.extraMeta/AccidentHandler20220715V3.json delete mode 100644 packages/bonds/deployments/bsc/AccidentHandler20220715V3.json delete mode 100644 packages/bonds/deployments/bsc/AccidentHandler20220715V3_Implementation.json delete mode 100644 packages/bonds/deployments/bsc/AccidentHandler20220715V3_Proxy.json delete mode 100644 packages/bonds/deployments/bsc/solcInputs/123cc147802b234c976c6c4db54070fc.json delete mode 100644 packages/bonds/deployments/bsc/solcInputs/41a8600e180880fe88609322a6b2ac21.json delete mode 100644 packages/bonds/deployments/bsctest/.extraMeta/AccidentHandler20220715V3.json create mode 100644 packages/bonds/deployments/bsctest/.extraMeta/BondFactory.json create mode 100644 packages/bonds/deployments/bsctest/.extraMeta/DiscountBond.json create mode 100644 packages/bonds/deployments/bsctest/.extraMeta/DuetTransparentUpgradeableProxy.json delete mode 100644 packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Implementation.json rename packages/bonds/deployments/bsctest/{AccidentHandler20220715V3.json => BondFactory.json} (74%) create mode 100644 packages/bonds/deployments/bsctest/BondFactory_Implementation.json rename packages/bonds/deployments/bsctest/{AccidentHandler20220715V3_Proxy.json => BondFactory_Proxy.json} (90%) create mode 100644 packages/bonds/deployments/bsctest/DiscountBond.json create mode 100644 packages/bonds/deployments/bsctest/DuetTransparentUpgradeableProxy.json create mode 100644 packages/bonds/deployments/bsctest/solcInputs/21f9402e2ca5f3597c1386289d997b81.json create mode 100644 packages/bonds/deployments/bsctest/solcInputs/86b5d7bad88174195e885f97b1fed94c.json create mode 100644 packages/bonds/deployments/bsctest/solcInputs/8ad23f9bb37bd1e3765ac943d46d8a69.json delete mode 100644 packages/bonds/deployments/bsctest/solcInputs/c64de78500c453458ed62a1018d284a7.json delete mode 100644 packages/bonds/scripts/compensasion.ts diff --git a/packages/bonds/contracts/AccidentHandler20220715V3.sol b/packages/bonds/contracts/AccidentHandler20220715V3.sol deleted file mode 100644 index 93d98e5..0000000 --- a/packages/bonds/contracts/AccidentHandler20220715V3.sol +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.8.9; -pragma abicoder v2; - -import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; - -import "@private/shared/libs/Adminable.sol"; - -contract AccidentHandler20220715V3 is Initializable, Adminable { - using SafeERC20Upgradeable for IERC20Upgradeable; - - // [user]: [token]: amount # retrievable - mapping(address => mapping(address => uint256)) public userRetrievableTokenMap; - // [user]: [token]: amount # retrieved - mapping(address => mapping(address => uint256)) public userRetrievedTokenMap; - // [token]: amount # retrievable - mapping(address => uint256) public remainTokenMap; - - uint256 public endingAt; - - event Retrieve(address user, address token, uint256 amount); - - struct Record { - address user; - address token; - uint256 amount; - } - - function initialize(address admin_, uint256 endingAt_) public initializer { - require(admin_ != address(0), "Can't set admin to zero address"); - _setAdmin(admin_); - setEndingAt(endingAt_); - } - - function retrievables(address[] calldata tokens) external view returns (uint256[] memory) { - uint256[] memory amounts = new uint256[](tokens.length); - for (uint256 i; i < tokens.length; i++) { - amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]]; - } - return amounts; - } - - function retrieved(address[] calldata tokens) external view returns (uint256[] memory) { - uint256[] memory amounts = new uint256[](tokens.length); - for (uint256 i; i < tokens.length; i++) { - amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]]; - } - return amounts; - } - - function setRecords(Record[] calldata records_) external onlyAdmin { - for (uint256 i; i < records_.length; i++) { - Record calldata record = records_[i]; - if (record.amount <= 0) { - continue; - } - require( - userRetrievableTokenMap[record.user][record.token] == 0 && - userRetrievedTokenMap[record.user][record.token] == 0, - string(abi.encodePacked("Can not set twice for user", record.user, ", token:", record.token)) - ); - userRetrievableTokenMap[record.user][record.token] += record.amount; - remainTokenMap[record.token] += record.amount; - } - } - - function setEndingAt(uint256 endingAt_) public onlyAdmin { - require(endingAt_ > 0, "Invalid ending time"); - endingAt = endingAt_; - } - - function retrieveTokens(address[] calldata tokens) external { - require(endingAt > block.timestamp, "Out of window"); - for (uint256 i; i < tokens.length; i++) { - IERC20Upgradeable token = IERC20Upgradeable(tokens[i]); - uint256 amount = userRetrievableTokenMap[msg.sender][tokens[i]]; - if (amount > 0) { - delete userRetrievableTokenMap[msg.sender][tokens[i]]; - userRetrievedTokenMap[msg.sender][tokens[i]] += amount; - remainTokenMap[tokens[i]] -= amount; - token.safeTransfer(msg.sender, amount); - emit Retrieve(msg.sender, tokens[i], amount); - } - } - } - - function transferTokens(IERC20Upgradeable[] calldata tokens_) public onlyAdmin { - for (uint256 i = 0; i < tokens_.length; i++) { - IERC20Upgradeable token = tokens_[i]; - token.safeTransfer(msg.sender, token.balanceOf(address(this))); - } - } -} diff --git a/packages/bonds/contracts/BondFactory.sol b/packages/bonds/contracts/BondFactory.sol new file mode 100644 index 0000000..7a80396 --- /dev/null +++ b/packages/bonds/contracts/BondFactory.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.9; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; + +import "./interfaces/IBondFactory.sol"; +import "./interfaces/IBond.sol"; +import "./libs/Adminable.sol"; +import "./libs/DuetTransparentUpgradeableProxy.sol"; + +contract BondFactory is IBondFactory, Initializable, Adminable { + /** + * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%; + * Calculation formula: x * percentage / PERCENTAGE_FACTOR + */ + uint16 public constant PERCENTAGE_FACTOR = 10000; + // kind => impl + mapping(string => address) public bondImplementations; + // kind => bond addresses + mapping(string => address[]) public kindBondsMapping; + // series => bond addresses + mapping(string => address[]) public seriesBondsMapping; + string[] public bondKinds; + string[] public bondSeries; + + // bond => price + mapping(address => uint256) public bondPrices; + + event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice); + event BondImplementationUpdated(string kind, address implementation, address previousImplementation); + event BondCreated(address bondToken); + event BondRemoved(address bondToken); + + constructor() initializer {} + + function initialize(address admin_) public initializer { + _setAdmin(admin_); + } + + function createBond( + string memory kind_, + string memory name_, + string memory symbol_, + uint256 initialPrice_, + uint256 initialGrant_, + string memory series_, + IERC20Upgradeable underlyingToken_, + uint256 maturity_ + ) external onlyAdmin returns (address bondTokenAddress) { + address proxyAdmin = address(this); + address bondImpl = bondImplementations[kind_]; + require(bondImpl != address(0), "BondFactory: Invalid bond implementation"); + require(initialPrice_ > 0, "BondFactory: INVALID_PRICE"); + bytes memory proxyData; + DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData); + bondTokenAddress = address(proxy); + IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_); + if (seriesBondsMapping[series_].length == 0) { + bondSeries.push(series_); + } + setPrice(bondTokenAddress, initialPrice_); + if (initialGrant_ > 0) { + grant(bondTokenAddress, initialGrant_); + } + seriesBondsMapping[series_].push(bondTokenAddress); + kindBondsMapping[kind_].push(bondTokenAddress); + emit BondCreated(bondTokenAddress); + } + + function getBondKinds() external view returns (string[] memory) { + return bondKinds; + } + + function getKindBondLength(string memory kind_) external view returns (uint256) { + return kindBondsMapping[kind_].length; + } + + function getBondSeries() external view returns (string[] memory) { + return bondSeries; + } + + function getSeriesBondLength(string memory series_) external view returns (uint256) { + return seriesBondsMapping[series_].length; + } + + function setBondImplementation( + string calldata kind_, + address impl_, + bool upgradeDeployed_ + ) external onlyAdmin { + if (bondImplementations[kind_] == address(0)) { + bondKinds.push(kind_); + } + emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]); + bondImplementations[kind_] = impl_; + if (!upgradeDeployed_) { + return; + } + for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) { + DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_); + } + } + + function setPrice(address bondToken_, uint256 price) public onlyAdmin { + emit PriceUpdated(bondToken_, price, bondPrices[bondToken_]); + bondPrices[bondToken_] = price; + } + + function getPrice(address bondToken_) public view returns (uint256) { + return bondPrices[bondToken_]; + } + + function priceDecimals() public view returns (uint256) { + return 8; + } + + function priceFactor() public view returns (uint256) { + return 10**priceDecimals(); + } + + function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin { + IBond(bondToken_).underlyingOut(amount_, msg.sender); + } + + function grant(address bondToken_, uint256 amount_) public onlyAdmin { + IBond(bondToken_).grant(amount_); + } + + function removeBond(IBond bondToken_) external onlyAdmin { + require(bondToken_.totalSupply() <= 0, "BondFactory: CANT_REMOVE"); + string memory kind = bondToken_.kind(); + string memory series = bondToken_.series(); + address bondTokenAddress = address(bondToken_); + + uint256 kindBondLength = kindBondsMapping[kind].length; + for (uint256 i = 0; i < kindBondLength; i++) { + if (kindBondsMapping[kind][i] != bondTokenAddress) { + continue; + } + kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1]; + kindBondsMapping[kind].pop(); + } + + uint256 seriesBondLength = seriesBondsMapping[series].length; + for (uint256 j = 0; j < seriesBondLength; j++) { + if (seriesBondsMapping[series][j] != bondTokenAddress) { + continue; + } + seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1]; + seriesBondsMapping[series].pop(); + } + + emit BondRemoved(bondTokenAddress); + } + + function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) { + // TODO + return 0; + } +} diff --git a/packages/bonds/contracts/DiscountBond.sol b/packages/bonds/contracts/DiscountBond.sol index a9f401c..1d8b5ea 100644 --- a/packages/bonds/contracts/DiscountBond.sol +++ b/packages/bonds/contracts/DiscountBond.sol @@ -1,59 +1,195 @@ -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; - -contract DiscountBond is ERC20 { - using SafeERC20 for IERC20; - address public factory; - IERC20 immutable underlyingToken; - uint256 public price; - uint256 immutable maturity; - uint256 constant priceDecimals = 1e8; - - constructor( +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.9; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; + +import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import "./interfaces/IBond.sol"; +import "./interfaces/IBondFactory.sol"; + +contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { + using SafeERC20Upgradeable for IERC20Upgradeable; + string public constant kind = "Discount"; + uint256 public constant MIN_TRADING_AMOUNT = 1e12; + + IBondFactory public factory; + IERC20Upgradeable public underlyingToken; + uint256 public maturity; + string public series; + uint256 public inventoryAmount; + uint256 public redeemedAmount; + + event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount); + event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount); + event BondRedeemed(address indexed account, uint256 amount); + event BondGranted(uint256 amount, uint256 inventoryAmount); + + constructor() initializer {} + + function initialize( string memory name_, string memory symbol_, + string memory series_, address factory_, - IERC20 underlyingToken_, + IERC20Upgradeable underlyingToken_, uint256 maturity_ - ) ERC20(name_, symbol_) { + ) external initializer { + __ERC20_init(name_, symbol_); + __ReentrancyGuard_init(); + require( + maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days), + "DiscountBond: INVALID_MATURITY" + ); + series = series_; underlyingToken = underlyingToken_; - factory = factory_; + factory = IBondFactory(factory_); maturity = maturity_; } modifier beforeMaturity() { - require(block.timestamp < maturity, "Can not do this at maturity"); + require(block.timestamp < maturity, "DiscountBond: MUST_BEFORE_MATURITY"); _; } - function setPrice(uint256 price_) external beforeMaturity { - price = price_; + modifier afterMaturity() { + require(block.timestamp >= maturity, "DiscountBond: MUST_AFTER_MATURITY"); + _; } - function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_) beforeMaturity { + modifier tradingGuard() { + require(getPrice() > 0, "INVALID_PRICE"); + _; + } + + modifier onlyFactory() { + require(msg.sender == address(factory), "DiscountBond: UNAUTHORIZED"); + _; + } + + /** + * @dev grant specific amount of bond for user mint. + */ + function grant(uint256 amount_) external onlyFactory { + inventoryAmount += amount_; + emit BondGranted(amount_, inventoryAmount); + } + + function getPrice() public view returns (uint256) { + return factory.getPrice(address(this)); + } + + function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_) + external + beforeMaturity + returns (uint256 bondAmount) + { underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_); - uint256 bondAmount = (underlyingAmount_ * priceDecimals) / price; + bondAmount = previewMintByUnderlyingAmount(underlyingAmount_); + inventoryAmount -= bondAmount; _mint(account_, bondAmount); + emit BondMinted(account_, bondAmount, underlyingAmount_); + } + + function previewMintByUnderlyingAmount(uint256 underlyingAmount_) + public + view + beforeMaturity + tradingGuard + returns (uint256 bondAmount) + { + require(underlyingAmount_ >= MIN_TRADING_AMOUNT, "DiscountBond: AMOUNT_TOO_LOW"); + bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice(); + require(inventoryAmount >= bondAmount, "DiscountBond: INSUFFICIENT_LIQUIDITY"); } - function mintByAmount(address account_, uint256 bondAmount_) external beforeMaturity { - uint256 underlyingAmount = (bondAmount_ * price) / priceDecimals; + function mintByBondAmount(address account_, uint256 bondAmount_) + external + beforeMaturity + returns (uint256 underlyingAmount) + { + underlyingAmount = previewMintByBondAmount(bondAmount_); underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount); + inventoryAmount -= bondAmount_; _mint(account_, bondAmount_); + emit BondMinted(account_, bondAmount_, underlyingAmount); + } + + function previewMintByBondAmount(uint256 bondAmount_) + public + view + beforeMaturity + tradingGuard + returns (uint256 underlyingAmount) + { + require(bondAmount_ >= MIN_TRADING_AMOUNT, "DiscountBond: AMOUNT_TOO_LOW"); + require(inventoryAmount >= bondAmount_, "DiscountBond: INSUFFICIENT_LIQUIDITY"); + underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor(); + } + + function sellByBondAmount(uint256 bondAmount_) + public + beforeMaturity + tradingGuard + returns (uint256 underlyingAmount) + { + underlyingAmount = previewSellByBondAmount(bondAmount_); + _burn(msg.sender, bondAmount_); + inventoryAmount += bondAmount_; + underlyingToken.safeTransfer(msg.sender, underlyingAmount); + emit BondSold(msg.sender, bondAmount_, underlyingAmount); } - function sellFor(address account_, uint256 bondAmount_) public beforeMaturity { - _burn(); + function previewSellByBondAmount(uint256 bondAmount_) + public + view + beforeMaturity + tradingGuard + returns (uint256 underlyingAmount) + { + require(bondAmount_ >= MIN_TRADING_AMOUNT, "DiscountBond: AMOUNT_TOO_LOW"); + require(balanceOf(msg.sender) >= bondAmount_, "DiscountBond: EXCEEDS_BALANCE"); + underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor(); + require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, "DiscountBond: INSUFFICIENT_LIQUIDITY"); } function redeem(uint256 bondAmount_) public { redeemFor(msg.sender, bondAmount_); } - function redeemFor(address account_, uint256 bondAmount_) public { - require(balanceOf(msg.sender) >= bondAmount_, "DiscountBond: redeem amount exceeds balance"); + function faceValue(uint256 bondAmount_) public view returns (uint256) { + return bondAmount_; + } + + function amountToUnderlying(uint256 bondAmount_) public view returns (uint256) { + if (block.timestamp >= maturity) { + return faceValue(bondAmount_); + } + return (bondAmount_ * getPrice()) / factory.priceFactor(); + } + + function redeemFor(address account_, uint256 bondAmount_) public afterMaturity { + require(balanceOf(msg.sender) >= bondAmount_, "DiscountBond: EXCEEDS_BALANCE"); _burn(msg.sender, bondAmount_); + redeemedAmount += bondAmount_; underlyingToken.safeTransfer(account_, bondAmount_); + emit BondRedeemed(account_, bondAmount_); + } + + /** + * @notice + */ + function underlyingOut(uint256 amount_, address to_) external onlyFactory { + underlyingToken.safeTransfer(to_, amount_); + } + + function emergencyWithdraw( + IERC20Upgradeable token_, + address to_, + uint256 amount_ + ) external onlyFactory { + token_.safeTransfer(to_, amount_); } } diff --git a/packages/bonds/contracts/interfaces/IBond.sol b/packages/bonds/contracts/interfaces/IBond.sol new file mode 100644 index 0000000..59392c6 --- /dev/null +++ b/packages/bonds/contracts/interfaces/IBond.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.9; + +import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; + +interface IBond is IERC20Upgradeable { + function initialize( + string memory name_, + string memory symbol_, + string memory series, + address factory_, + IERC20Upgradeable underlyingToken_, + uint256 maturity_ + ) external; + + function kind() external returns (string memory); + + function series() external returns (string memory); + + function underlyingOut(uint256 amount_, address to_) external; + + function grant(uint256 amount_) external; + + function faceValue(uint256 bondAmount_) external view returns (uint256); + + function amountToUnderlying(uint256 bondAmount_) external view returns (uint256); +} diff --git a/packages/bonds/contracts/interfaces/IBondFactory.sol b/packages/bonds/contracts/interfaces/IBondFactory.sol new file mode 100644 index 0000000..172a59a --- /dev/null +++ b/packages/bonds/contracts/interfaces/IBondFactory.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.9; + +interface IBondFactory { + function priceFactor() external view returns (uint256); + + function getPrice(address bondToken_) external view returns (uint256 price); +} diff --git a/packages/bonds/contracts/libs/Adminable.sol b/packages/bonds/contracts/libs/Adminable.sol new file mode 100644 index 0000000..8e0f1dd --- /dev/null +++ b/packages/bonds/contracts/libs/Adminable.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.9; + +abstract contract Adminable { + event AdminUpdated(address indexed user, address indexed newAdmin); + + address public admin; + + modifier onlyAdmin() virtual { + require(msg.sender == admin, "UNAUTHORIZED"); + + _; + } + + function setAdmin(address newAdmin) public virtual onlyAdmin { + _setAdmin(newAdmin); + } + + function _setAdmin(address newAdmin) internal { + require(newAdmin != address(0), "Can not set admin to zero address"); + admin = newAdmin; + + emit AdminUpdated(msg.sender, newAdmin); + } +} diff --git a/packages/bonds/contracts/libs/DuetTransparentUpgradeableProxy.sol b/packages/bonds/contracts/libs/DuetTransparentUpgradeableProxy.sol new file mode 100644 index 0000000..4e20ff0 --- /dev/null +++ b/packages/bonds/contracts/libs/DuetTransparentUpgradeableProxy.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.9; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +contract DuetTransparentUpgradeableProxy is TransparentUpgradeableProxy { + constructor( + address _logic, + address admin_, + bytes memory _data + ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {} + + /** + * @dev override parent behavior to manage bonds fully in Factory + * + */ + function _beforeFallback() internal virtual override {} +} diff --git a/packages/bonds/deploy/001_deploy-handler.ts b/packages/bonds/deploy/001_deploy-handler.ts deleted file mode 100644 index ead73d5..0000000 --- a/packages/bonds/deploy/001_deploy-handler.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { DeployFunction } from 'hardhat-deploy/types' -import { HardhatRuntimeEnvironment } from 'hardhat/types' -import config from '../config' -// eslint-disable-next-line node/no-unpublished-import -import { useLogger } from '../scripts/utils' -import { HardhatDeployRuntimeEnvironment } from '../types/hardhat-deploy' -import { useNetworkName, advancedDeploy } from './.defines' - -// eslint-disable-next-line node/no-missing-import -import * as csv from 'csv/sync' -import * as fs from 'fs' -import * as path from 'path' -import { parseInt } from 'lodash' -import { BigNumber as EthersBigNumber } from 'ethers' -import BigNumber from 'bignumber.js' -import { tokens } from '../scripts/compensasion' - -enum Names { - AccidentHandler20220715V3 = 'AccidentHandler20220715V3', -} - -const gasLimit = 3000000 -const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' - -const logger = useLogger(__filename) -const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const { deployments, getNamedAccounts } = hre as unknown as HardhatDeployRuntimeEnvironment - const { deploy, get, read, execute } = deployments - - const networkName = useNetworkName() - const { deployer } = await getNamedAccounts() - - const endingAt = Math.round(Date.now() / 1000) + 1 * 60 * 60 * 24 * 61 - - const ret = await advancedDeploy( - { - hre, - logger, - proxied: true, - name: Names.AccidentHandler20220715V3, - }, - async ({ name }) => { - return await deploy(name, { - from: deployer, - contract: name, - proxy: { - execute: { - init: { - methodName: 'initialize', - args: [deployer, endingAt], - }, - }, - }, - log: true, - autoMine: true, // speed up deployment on local network (ganache, hardhat), no effect on live networks - }) - }, - ) - if (ret.newlyDeployed && ret.numDeployments && ret.numDeployments <= 1) { - await addRecords(hre) - } - await queryRemainTokenMap(hre) -} -export default func - -async function addRecords(hre: HardhatRuntimeEnvironment) { - const { deployments, getNamedAccounts } = hre as unknown as HardhatDeployRuntimeEnvironment - const { execute } = deployments - const { deployer } = await getNamedAccounts() - const rows: Array<{ - Account: string - // eslint-disable-next-line camelcase - BUSD_0xe9e7cea3dedca5984780bafc599bd69add087d56: string - 'dWTI-BUSD_0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d': string - 'dXAU-BUSD_0x95ca57ff396864c25520bc97deaae978daaf73f3': string - 'dTMC-BUSD_0xf048897b35963aaed1a241512d26540c7ec42a60': string - 'dUSD-BUSD-to-BUSD': string - 'dUSD-BUSD-vault-to-BUSD': string - 'DUET-dUSD-to-DUET-CAKE_0xbdf0aa1d1985caa357a6ac6661d838da8691c569': string - 'DUET-dUSD-vault-to-DUET-CAKE': string - }> = csv.parse(fs.readFileSync(path.join(__dirname, '../data/userCompensation-0810-1909-filtered.csv')), { - columns: true, - // cast: true, - }) - - console.log(rows) - - const records: Array<{ - user: string - token: string - amount: string - }> = [] - - for (const row of rows) { - const user = row.Account - if (parseFloat(row.BUSD_0xe9e7cea3dedca5984780bafc599bd69add087d56) >= 0.1) { - records.push({ - user, - token: '0xe9e7cea3dedca5984780bafc599bd69add087d56', - amount: new BigNumber(row.BUSD_0xe9e7cea3dedca5984780bafc599bd69add087d56).multipliedBy(1e18).toFixed(), - }) - } - if (parseFloat(row['dWTI-BUSD_0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d']) >= 0.1) { - records.push({ - user, - token: '0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d', - amount: new BigNumber(row['dWTI-BUSD_0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d']).multipliedBy(1e18).toFixed(), - }) - } - if (parseFloat(row['dXAU-BUSD_0x95ca57ff396864c25520bc97deaae978daaf73f3']) >= 0.1) { - records.push({ - user, - token: '0x95ca57ff396864c25520bc97deaae978daaf73f3', - amount: new BigNumber(row['dXAU-BUSD_0x95ca57ff396864c25520bc97deaae978daaf73f3']).multipliedBy(1e18).toFixed(), - }) - } - if (parseFloat(row['dTMC-BUSD_0xf048897b35963aaed1a241512d26540c7ec42a60']) >= 0.1) { - records.push({ - user, - token: '0xf048897b35963aaed1a241512d26540c7ec42a60', - amount: new BigNumber(row['dTMC-BUSD_0xf048897b35963aaed1a241512d26540c7ec42a60']).multipliedBy(1e18).toFixed(), - }) - } - if (parseFloat(row['DUET-dUSD-to-DUET-CAKE_0xbdf0aa1d1985caa357a6ac6661d838da8691c569']) >= 0.1) { - records.push({ - user, - token: '0xbdf0aa1d1985caa357a6ac6661d838da8691c569', - amount: new BigNumber(row['DUET-dUSD-to-DUET-CAKE_0xbdf0aa1d1985caa357a6ac6661d838da8691c569']) - .multipliedBy(1e18) - .toFixed(), - }) - } - } - - logger.info('adding records', records.length) - await execute( - Names.AccidentHandler20220715V3, - { - from: deployer, - gasLimit: 3000000, - }, - 'setRecords', - records, - ) - logger.info('added records', records.length) -} - -async function queryRemainTokenMap(hre: HardhatRuntimeEnvironment) { - const { deployments } = hre as unknown as HardhatDeployRuntimeEnvironment - const { read } = deployments - const remainTokenMap: Record = {} - for (const [symbol, address] of Object.entries(tokens)) { - remainTokenMap[symbol] = ( - (await read(Names.AccidentHandler20220715V3, 'remainTokenMap', address)) as EthersBigNumber - ).toString() - } - console.log('remainTokenMap', remainTokenMap) -} diff --git a/packages/bonds/deploy/001_deploy_proxyForVerify.ts b/packages/bonds/deploy/001_deploy_proxyForVerify.ts new file mode 100644 index 0000000..45e7803 --- /dev/null +++ b/packages/bonds/deploy/001_deploy_proxyForVerify.ts @@ -0,0 +1,33 @@ +import { DeployFunction } from 'hardhat-deploy/types' +import { HardhatRuntimeEnvironment } from 'hardhat/types' +// eslint-disable-next-line node/no-unpublished-import +import { useLogger } from '../scripts/utils' +import { HardhatDeployRuntimeEnvironment } from '../types/hardhat-deploy' +import { advancedDeploy } from './.defines' + +const logger = useLogger(__filename) +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const { deployments, getNamedAccounts } = hre as unknown as HardhatDeployRuntimeEnvironment + const { deploy } = deployments + + const { deployer } = await getNamedAccounts() + + await advancedDeploy( + { + hre, + logger, + name: 'DuetTransparentUpgradeableProxy', + }, + async ({ name }) => { + return await deploy(name, { + from: deployer, + contract: name, + // dummy contracts + args: ['0x4F90C9D2ddb4D3569294A6011C87D06F66E277Dc', '0x4F90C9D2ddb4D3569294A6011C87D06F66E277Dc', '0x'], + log: true, + autoMine: true, // speed up deployment on local network (ganache, hardhat), no effect on live networks + }) + }, + ) +} +export default func diff --git a/packages/bonds/deploy/002_deploy_bondFactory.ts b/packages/bonds/deploy/002_deploy_bondFactory.ts new file mode 100644 index 0000000..2ceaebf --- /dev/null +++ b/packages/bonds/deploy/002_deploy_bondFactory.ts @@ -0,0 +1,45 @@ +import { DeployFunction } from 'hardhat-deploy/types' +import { HardhatRuntimeEnvironment } from 'hardhat/types' +// eslint-disable-next-line node/no-unpublished-import +import { useLogger } from '../scripts/utils' +import { HardhatDeployRuntimeEnvironment } from '../types/hardhat-deploy' +import { advancedDeploy } from './.defines' + +const logger = useLogger(__filename) + +export enum BondFactoryNames { + Factory = 'BondFactory', +} + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const { deployments, getNamedAccounts } = hre as unknown as HardhatDeployRuntimeEnvironment + const { deploy } = deployments + + const { deployer } = await getNamedAccounts() + + await advancedDeploy( + { + hre, + logger, + proxied: true, + name: BondFactoryNames.Factory, + }, + async ({ name }) => { + return await deploy(name, { + from: deployer, + contract: name, + proxy: { + execute: { + init: { + methodName: 'initialize', + args: [deployer], + }, + }, + }, + log: true, + autoMine: true, // speed up deployment on local network (ganache, hardhat), no effect on live networks + }) + }, + ) +} +export default func diff --git a/packages/bonds/deploy/003_deploy_bondImplementation.ts b/packages/bonds/deploy/003_deploy_bondImplementation.ts new file mode 100644 index 0000000..6d4cdba --- /dev/null +++ b/packages/bonds/deploy/003_deploy_bondImplementation.ts @@ -0,0 +1,52 @@ +import { DeployFunction } from 'hardhat-deploy/types' +import { HardhatRuntimeEnvironment } from 'hardhat/types' +// eslint-disable-next-line node/no-unpublished-import +import { useLogger } from '../scripts/utils' +import { HardhatDeployRuntimeEnvironment } from '../types/hardhat-deploy' +import { advancedDeploy } from './.defines' +import { exec } from 'child_process' +import { BondFactoryNames } from './002_deploy_bondFactory' + +const logger = useLogger(__filename) + +export enum BondImplementationNames { + DiscountBond = 'DiscountBond', +} + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const { deployments, getNamedAccounts } = hre as unknown as HardhatDeployRuntimeEnvironment + const { deploy, execute } = deployments + + const { deployer } = await getNamedAccounts() + + const execOptions = { + from: deployer, + gasLimit: 30000000, + } + const discountBond = await advancedDeploy( + { + hre, + logger, + name: BondImplementationNames.DiscountBond, + }, + async ({ name }) => { + return await deploy(name, { + from: deployer, + contract: name, + log: true, + autoMine: true, // speed up deployment on local network (ganache, hardhat), no effect on live networks + }) + }, + ) + if (discountBond.newlyDeployed) { + await execute( + BondFactoryNames.Factory, + execOptions, + 'setBondImplementation', + 'Discount', + discountBond.address, + true, + ) + } +} +export default func diff --git a/packages/bonds/deployments/bsc/.chainId b/packages/bonds/deployments/bsc/.chainId deleted file mode 100644 index 2ebc651..0000000 --- a/packages/bonds/deployments/bsc/.chainId +++ /dev/null @@ -1 +0,0 @@ -56 \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/.extraMeta/AccidentHandler20220715V3.json b/packages/bonds/deployments/bsc/.extraMeta/AccidentHandler20220715V3.json deleted file mode 100644 index ed332ea..0000000 --- a/packages/bonds/deployments/bsc/.extraMeta/AccidentHandler20220715V3.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "class": "AccidentHandler20220715V3", - "instance": "AccidentHandler20220715V3" -} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/AccidentHandler20220715V3.json b/packages/bonds/deployments/bsc/AccidentHandler20220715V3.json deleted file mode 100644 index 77ca956..0000000 --- a/packages/bonds/deployments/bsc/AccidentHandler20220715V3.json +++ /dev/null @@ -1,540 +0,0 @@ -{ - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousImplementation", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "ProxyImplementationUpdated", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "id", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Retrieve", - "type": "event" - }, - { - "inputs": [], - "name": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "endingAt", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "admin_", - "type": "address" - }, - { - "internalType": "uint256", - "name": "endingAt_", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "remainTokenMap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "name": "retrievables", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "name": "retrieveTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "name": "retrieved", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "setAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "endingAt_", - "type": "uint256" - } - ], - "name": "setEndingAt", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct AccidentHandler20220715V3.Record[]", - "name": "records_", - "type": "tuple[]" - } - ], - "name": "setRecords", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IERC20Upgradeable[]", - "name": "tokens_", - "type": "address[]" - } - ], - "name": "transferTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRetrievableTokenMap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRetrievedTokenMap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "implementationAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "ownerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "constructor" - } - ], - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "receipt": { - "to": null, - "from": "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", - "contractAddress": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "transactionIndex": 52, - "gasUsed": "692905", - "logsBloom": "0x00000000000000000000000000000000002000000000004000800000000000000010000000000000000400000000000000000000000000000000000000000000001000000000000000000040000000000001000000000000000600000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000180000000000000000000000040000000000000000000000600000000000000000000000000000000000000000000000000000000000000050000000000000000000004000000000020000000000000000000000400000000000000000000000000000000000000000000", - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec", - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "logs": [ - { - "transactionIndex": 52, - "blockNumber": 20354295, - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "topics": [ - "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000765675852c05d358b6c5b9edf30da8b36ebd9b66" - ], - "data": "0x", - "logIndex": 176, - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" - }, - { - "transactionIndex": 52, - "blockNumber": 20354295, - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "topics": [ - "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", - "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf", - "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf" - ], - "data": "0x", - "logIndex": 177, - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" - }, - { - "transactionIndex": 52, - "blockNumber": 20354295, - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 178, - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" - }, - { - "transactionIndex": 52, - "blockNumber": 20354295, - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf" - ], - "data": "0x", - "logIndex": 179, - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" - } - ], - "blockNumber": 20354295, - "cumulativeGasUsed": "7296349", - "status": 1, - "byzantium": true - }, - "args": [ - "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", - "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", - "0xcd6dc68700000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf000000000000000000000000000000000000000000000000000000006345aef5" - ], - "numDeployments": 1, - "solcInputHash": "41a8600e180880fe88609322a6b2ac21", - "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/proxy/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/proxy/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n constructor(\\n address implementationAddress,\\n address ownerAddress,\\n bytes memory data\\n ) payable {\\n _setImplementation(implementationAddress, data);\\n _setOwner(ownerAddress);\\n }\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xb9c14a66c8a4eefabca13cc8dd8133c1587909bb1124fa793c50ab46358b63e4\",\"license\":\"MIT\"},\"solc_0.8/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 {\\n revert(0, retSz)\\n }\\n default {\\n return(0, retSz)\\n }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success, ) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x68c8cf1a340a53d31de8ed808bb66d64e83d50b20d80a0b2dff6aba903cebc98\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405260405162000ccc38038062000ccc8339810160408190526200002691620001fc565b62000032838262000046565b6200003d8262000128565b505050620002fa565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511562000123576000836001600160a01b031683604051620000ca9190620002dc565b600060405180830381855af49150503d806000811462000107576040519150601f19603f3d011682016040523d82523d6000602084013e6200010c565b606091505b505090508062000121573d806000803e806000fd5b505b505050565b60006200014260008051602062000cac8339815191525490565b90508160008051602062000cac83398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80516001600160a01b0381168114620001b257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001ea578181015183820152602001620001d0565b83811115620001215750506000910152565b6000806000606084860312156200021257600080fd5b6200021d846200019a565b92506200022d602085016200019a565b60408501519092506001600160401b03808211156200024b57600080fd5b818601915086601f8301126200026057600080fd5b815181811115620002755762000275620001b7565b604051601f8201601f19908116603f01168101908382118183101715620002a057620002a0620001b7565b81604052828152896020848701011115620002ba57600080fd5b620002cd836020830160208801620001cd565b80955050505050509250925092565b60008251620002f0818460208701620001cd565b9190910192915050565b6109a2806200030a6000396000f3fe60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", - "deployedBytecode": "0x60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033", - "execute": { - "methodName": "initialize", - "args": [ - "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", - 1665511157 - ] - }, - "implementation": "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "Proxy implementing EIP173 for ownership management", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Implementation.json b/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Implementation.json deleted file mode 100644 index 8778743..0000000 --- a/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Implementation.json +++ /dev/null @@ -1,421 +0,0 @@ -{ - "address": "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Retrieve", - "type": "event" - }, - { - "inputs": [], - "name": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "endingAt", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "admin_", - "type": "address" - }, - { - "internalType": "uint256", - "name": "endingAt_", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "remainTokenMap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "name": "retrievables", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "name": "retrieveTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "name": "retrieved", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "setAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "endingAt_", - "type": "uint256" - } - ], - "name": "setEndingAt", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct AccidentHandler20220715V3.Record[]", - "name": "records_", - "type": "tuple[]" - } - ], - "name": "setRecords", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "contract IERC20Upgradeable[]", - "name": "tokens_", - "type": "address[]" - } - ], - "name": "transferTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRetrievableTokenMap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRetrievedTokenMap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xa2b350650a4a14ed89f0a3ce8995e52b19d9f04e13a23b46bcf4102a2c5fa3b9", - "receipt": { - "to": null, - "from": "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", - "contractAddress": "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", - "transactionIndex": 34, - "gasUsed": "1143235", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x257a16992106f7f5cd7a482e21248e781848286c65e8ca3a3d368e8b378470c2", - "transactionHash": "0xa2b350650a4a14ed89f0a3ce8995e52b19d9f04e13a23b46bcf4102a2c5fa3b9", - "logs": [], - "blockNumber": 20354292, - "cumulativeGasUsed": "4206900", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "123cc147802b234c976c6c4db54070fc", - "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Retrieve\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endingAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"endingAt_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"remainTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrievables\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrieveTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrieved\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"endingAt_\",\"type\":\"uint256\"}],\"name\":\"setEndingAt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct AccidentHandler20220715V3.Record[]\",\"name\":\"records_\",\"type\":\"tuple[]\"}],\"name\":\"setRecords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable[]\",\"name\":\"tokens_\",\"type\":\"address[]\"}],\"name\":\"transferTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userRetrievableTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userRetrievedTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/AccidentHandler20220715V3.sol\":\"AccidentHandler20220715V3\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n function safeTransfer(\\n IERC20Upgradeable token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20Upgradeable token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3e26a49d2fa5ef8338b8a9467c91e54f417cb07e849b1cc0f4ebc4d2a147938e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@private/shared/libs/Adminable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nabstract contract Adminable {\\n event AdminUpdated(address indexed user, address indexed newAdmin);\\n\\n address public admin;\\n\\n modifier onlyAdmin() virtual {\\n require(msg.sender == admin, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n function setAdmin(address newAdmin) public virtual onlyAdmin {\\n _setAdmin(newAdmin);\\n }\\n\\n function _setAdmin(address newAdmin) internal {\\n require(newAdmin != address(0), \\\"Can not set admin to zero address\\\");\\n admin = newAdmin;\\n\\n emit AdminUpdated(msg.sender, newAdmin);\\n }\\n}\\n\",\"keccak256\":\"0xe47c97c0e3edad2d1df3e664376a7bb46e1aaf51b4c4acc73c4a2cfdc747185f\",\"license\":\"GPL-3.0\"},\"contracts/AccidentHandler20220715V3.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\npragma abicoder v2;\\n\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"@private/shared/libs/Adminable.sol\\\";\\n\\n\\ncontract AccidentHandler20220715V3 is Initializable, Adminable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n // [user]: [token]: amount # retrievable\\n mapping(address => mapping(address => uint)) public userRetrievableTokenMap;\\n // [user]: [token]: amount # retrieved\\n mapping(address => mapping(address => uint)) public userRetrievedTokenMap;\\n // [token]: amount # retrievable\\n mapping(address => uint) public remainTokenMap;\\n\\n uint public endingAt;\\n\\n event Retrieve(address user, address token, uint amount);\\n\\n struct Record {\\n address user;\\n address token;\\n uint amount;\\n }\\n\\n function initialize(address admin_, uint endingAt_) public initializer {\\n require(admin_ != address(0), \\\"Can't set admin to zero address\\\");\\n _setAdmin(admin_);\\n setEndingAt(endingAt_);\\n }\\n\\n function retrievables(address[] calldata tokens) external view returns (uint[] memory) {\\n uint[] memory amounts = new uint[](tokens.length);\\n for (uint i; i < tokens.length; i++) {\\n amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]];\\n }\\n return amounts;\\n }\\n\\n function retrieved(address[] calldata tokens) external view returns (uint[] memory) {\\n uint[] memory amounts = new uint[](tokens.length);\\n for (uint i; i < tokens.length; i++) {\\n amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]];\\n }\\n return amounts;\\n }\\n\\n function setRecords(Record[] calldata records_) external onlyAdmin {\\n for (uint i; i < records_.length; i++) {\\n Record calldata record = records_[i];\\n if (record.amount <= 0) {\\n continue;\\n }\\n require(userRetrievableTokenMap[record.user][record.token] == 0\\n && userRetrievedTokenMap[record.user][record.token] == 0,\\n string(abi.encodePacked(\\\"Can not set twice for user\\\", record.user, \\\", token:\\\", record.token))\\n );\\n userRetrievableTokenMap[record.user][record.token] += record.amount;\\n remainTokenMap[record.token] += record.amount;\\n }\\n }\\n\\n function setEndingAt(uint endingAt_) public onlyAdmin {\\n require(endingAt_ > 0, \\\"Invalid ending time\\\");\\n endingAt = endingAt_;\\n }\\n\\n function retrieveTokens(address[] calldata tokens) external {\\n require(endingAt > block.timestamp, \\\"Out of window\\\");\\n for (uint i; i < tokens.length; i++) {\\n IERC20Upgradeable token = IERC20Upgradeable(tokens[i]);\\n uint amount = userRetrievableTokenMap[msg.sender][tokens[i]];\\n if (amount > 0) {\\n delete userRetrievableTokenMap[msg.sender][tokens[i]];\\n userRetrievedTokenMap[msg.sender][tokens[i]] += amount;\\n remainTokenMap[tokens[i]] -= amount;\\n token.safeTransfer(msg.sender, amount);\\n emit Retrieve(msg.sender, tokens[i], amount);\\n }\\n }\\n }\\n\\n function transferTokens(IERC20Upgradeable[] calldata tokens_) public onlyAdmin {\\n for (uint256 i = 0; i < tokens_.length; i++) {\\n IERC20Upgradeable token = tokens_[i];\\n token.safeTransfer(msg.sender, token.balanceOf(address(this)));\\n }\\n }\\n}\\n\",\"keccak256\":\"0xc585eac7022a94f2783db764661ef71747619859ddda82a6d354ce374a17f6e1\",\"license\":\"GPL-3.0\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506113b9806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639a22d5a61161008c578063cd6dc68711610066578063cd6dc687146101c7578063e797e9ef146101da578063f1a0d18b146101ed578063f851a4401461020d57600080fd5b80639a22d5a614610198578063a4d5b6f3146101ab578063c23b4988146101be57600080fd5b80632d915022146100d457806336463706146101125780635ab2fd3214610132578063704b6c021461014757806376de352d1461015a5780637fa3b3da1461016d575b600080fd5b6100ff6100e2366004610fe7565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61012561012036600461106c565b61023e565b60405161010991906110ae565b6101456101403660046110f2565b610321565b005b61014561015536600461110b565b6103a5565b61012561016836600461106c565b6103e1565b6100ff61017b366004610fe7565b600160209081526000928352604080842090915290825290205481565b6101456101a6366004611128565b6104bc565b6101456101b936600461106c565b610780565b6100ff60045481565b6101456101d536600461119d565b610888565b6101456101e836600461106c565b61095e565b6100ff6101fb36600461110b565b60036020526000908152604090205481565b600054610226906201000090046001600160a01b031681565b6040516001600160a01b039091168152602001610109565b606060008267ffffffffffffffff81111561025b5761025b6111c9565b604051908082528060200260200182016040528015610284578160200160208202803683370190505b50905060005b8381101561031957336000908152600160205260408120908686848181106102b4576102b46111df565b90506020020160208101906102c9919061110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106102fc576102fc6111df565b6020908102919091010152806103118161120b565b91505061028a565b509392505050565b6000546201000090046001600160a01b0316331461035a5760405162461bcd60e51b815260040161035190611226565b60405180910390fd5b600081116103a05760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420656e64696e672074696d6560681b6044820152606401610351565b600455565b6000546201000090046001600160a01b031633146103d55760405162461bcd60e51b815260040161035190611226565b6103de81610bee565b50565b606060008267ffffffffffffffff8111156103fe576103fe6111c9565b604051908082528060200260200182016040528015610427578160200160208202803683370190505b50905060005b838110156103195733600090815260026020526040812090868684818110610457576104576111df565b905060200201602081019061046c919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061049f5761049f6111df565b6020908102919091010152806104b48161120b565b91505061042d565b6000546201000090046001600160a01b031633146104ec5760405162461bcd60e51b815260040161035190611226565b60005b8181101561077b573683838381811061050a5761050a6111df565b905060600201905060008160400135116105245750610769565b60016000610535602084018461110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082602001602081019061056a919061110b565b6001600160a01b031681526020810191909152604001600020541580156105ee57506002600061059d602084018461110b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008260200160208101906105d2919061110b565b6001600160a01b03168152602081019190915260400160002054155b6105fb602083018361110b565b61060b604084016020850161110b565b6040517f43616e206e6f742073657420747769636520666f72207573657200000000000060208201526bffffffffffffffffffffffff19606093841b8116603a8301526716103a37b5b2b71d60c11b604e8301529190921b166056820152606a01604051602081830303815290604052906106995760405162461bcd60e51b8152600401610351919061127c565b506040810135600160006106b0602085018561110b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008360200160208101906106e5919061110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461071491906112af565b909155505060408101803590600390600090610733906020860161110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461076291906112af565b9091555050505b806107738161120b565b9150506104ef565b505050565b6000546201000090046001600160a01b031633146107b05760405162461bcd60e51b815260040161035190611226565b60005b8181101561077b5760008383838181106107cf576107cf6111df565b90506020020160208101906107e4919061110b565b6040516370a0823160e01b81523060048201529091506108759033906001600160a01b038416906370a082319060240160206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086491906112c7565b6001600160a01b0384169190610ca3565b50806108808161120b565b9150506107b3565b60006108946001610cf5565b905080156108ac576000805461ff0019166101001790555b6001600160a01b0383166109025760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207365742061646d696e20746f207a65726f2061646472657373006044820152606401610351565b61090b83610bee565b61091482610321565b801561077b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b426004541161099f5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f662077696e646f7760981b6044820152606401610351565b60005b8181101561077b5760008383838181106109be576109be6111df565b90506020020160208101906109d3919061110b565b33600090815260016020526040812091925090818686868181106109f9576109f96111df565b9050602002016020810190610a0e919061110b565b6001600160a01b0316815260208101919091526040016000205490508015610bd95733600090815260016020526040812090868686818110610a5257610a526111df565b9050602002016020810190610a67919061110b565b6001600160a01b0316815260208082019290925260409081016000908120819055338152600290925281208291878787818110610aa657610aa66111df565b9050602002016020810190610abb919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610aea91906112af565b9091555081905060036000878787818110610b0757610b076111df565b9050602002016020810190610b1c919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610b4b91906112e0565b90915550610b6590506001600160a01b0383163383610ca3565b7f8bd0db04d7d748ae70a6a244675345c05f70e540f344927714da92f35b2418ce33868686818110610b9957610b996111df565b9050602002016020810190610bae919061110b565b604080516001600160a01b039384168152929091166020830152810183905260600160405180910390a15b50508080610be69061120b565b9150506109a2565b6001600160a01b038116610c4e5760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b6064820152608401610351565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261077b908490610d7d565b60008054610100900460ff1615610d3c578160ff166001148015610d185750303b155b610d345760405162461bcd60e51b8152600401610351906112f7565b506000919050565b60005460ff808416911610610d635760405162461bcd60e51b8152600401610351906112f7565b506000805460ff191660ff92909216919091179055600190565b6000610dd2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e4f9092919063ffffffff16565b80519091501561077b5780806020019051810190610df09190611345565b61077b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610351565b6060610e5e8484600085610e68565b90505b9392505050565b606082471015610ec95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610351565b6001600160a01b0385163b610f205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610351565b600080866001600160a01b03168587604051610f3c9190611367565b60006040518083038185875af1925050503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b5091509150610f8e828286610f99565b979650505050505050565b60608315610fa8575081610e61565b825115610fb85782518084602001fd5b8160405162461bcd60e51b8152600401610351919061127c565b6001600160a01b03811681146103de57600080fd5b60008060408385031215610ffa57600080fd5b823561100581610fd2565b9150602083013561101581610fd2565b809150509250929050565b60008083601f84011261103257600080fd5b50813567ffffffffffffffff81111561104a57600080fd5b6020830191508360208260051b850101111561106557600080fd5b9250929050565b6000806020838503121561107f57600080fd5b823567ffffffffffffffff81111561109657600080fd5b6110a285828601611020565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156110e6578351835292840192918401916001016110ca565b50909695505050505050565b60006020828403121561110457600080fd5b5035919050565b60006020828403121561111d57600080fd5b8135610e6181610fd2565b6000806020838503121561113b57600080fd5b823567ffffffffffffffff8082111561115357600080fd5b818501915085601f83011261116757600080fd5b81358181111561117657600080fd5b86602060608302850101111561118b57600080fd5b60209290920196919550909350505050565b600080604083850312156111b057600080fd5b82356111bb81610fd2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561121f5761121f6111f5565b5060010190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60005b8381101561126757818101518382015260200161124f565b83811115611276576000848401525b50505050565b602081526000825180602084015261129b81604085016020870161124c565b601f01601f19169190910160400192915050565b600082198211156112c2576112c26111f5565b500190565b6000602082840312156112d957600080fd5b5051919050565b6000828210156112f2576112f26111f5565b500390565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60006020828403121561135757600080fd5b81518015158114610e6157600080fd5b6000825161137981846020870161124c565b919091019291505056fea26469706673582212201a371d8c26e9835bdf1c431a29f2afec84f77ca22889db0485227d008775e97a64736f6c63430008090033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80639a22d5a61161008c578063cd6dc68711610066578063cd6dc687146101c7578063e797e9ef146101da578063f1a0d18b146101ed578063f851a4401461020d57600080fd5b80639a22d5a614610198578063a4d5b6f3146101ab578063c23b4988146101be57600080fd5b80632d915022146100d457806336463706146101125780635ab2fd3214610132578063704b6c021461014757806376de352d1461015a5780637fa3b3da1461016d575b600080fd5b6100ff6100e2366004610fe7565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61012561012036600461106c565b61023e565b60405161010991906110ae565b6101456101403660046110f2565b610321565b005b61014561015536600461110b565b6103a5565b61012561016836600461106c565b6103e1565b6100ff61017b366004610fe7565b600160209081526000928352604080842090915290825290205481565b6101456101a6366004611128565b6104bc565b6101456101b936600461106c565b610780565b6100ff60045481565b6101456101d536600461119d565b610888565b6101456101e836600461106c565b61095e565b6100ff6101fb36600461110b565b60036020526000908152604090205481565b600054610226906201000090046001600160a01b031681565b6040516001600160a01b039091168152602001610109565b606060008267ffffffffffffffff81111561025b5761025b6111c9565b604051908082528060200260200182016040528015610284578160200160208202803683370190505b50905060005b8381101561031957336000908152600160205260408120908686848181106102b4576102b46111df565b90506020020160208101906102c9919061110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106102fc576102fc6111df565b6020908102919091010152806103118161120b565b91505061028a565b509392505050565b6000546201000090046001600160a01b0316331461035a5760405162461bcd60e51b815260040161035190611226565b60405180910390fd5b600081116103a05760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420656e64696e672074696d6560681b6044820152606401610351565b600455565b6000546201000090046001600160a01b031633146103d55760405162461bcd60e51b815260040161035190611226565b6103de81610bee565b50565b606060008267ffffffffffffffff8111156103fe576103fe6111c9565b604051908082528060200260200182016040528015610427578160200160208202803683370190505b50905060005b838110156103195733600090815260026020526040812090868684818110610457576104576111df565b905060200201602081019061046c919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061049f5761049f6111df565b6020908102919091010152806104b48161120b565b91505061042d565b6000546201000090046001600160a01b031633146104ec5760405162461bcd60e51b815260040161035190611226565b60005b8181101561077b573683838381811061050a5761050a6111df565b905060600201905060008160400135116105245750610769565b60016000610535602084018461110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082602001602081019061056a919061110b565b6001600160a01b031681526020810191909152604001600020541580156105ee57506002600061059d602084018461110b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008260200160208101906105d2919061110b565b6001600160a01b03168152602081019190915260400160002054155b6105fb602083018361110b565b61060b604084016020850161110b565b6040517f43616e206e6f742073657420747769636520666f72207573657200000000000060208201526bffffffffffffffffffffffff19606093841b8116603a8301526716103a37b5b2b71d60c11b604e8301529190921b166056820152606a01604051602081830303815290604052906106995760405162461bcd60e51b8152600401610351919061127c565b506040810135600160006106b0602085018561110b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008360200160208101906106e5919061110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461071491906112af565b909155505060408101803590600390600090610733906020860161110b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461076291906112af565b9091555050505b806107738161120b565b9150506104ef565b505050565b6000546201000090046001600160a01b031633146107b05760405162461bcd60e51b815260040161035190611226565b60005b8181101561077b5760008383838181106107cf576107cf6111df565b90506020020160208101906107e4919061110b565b6040516370a0823160e01b81523060048201529091506108759033906001600160a01b038416906370a082319060240160206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086491906112c7565b6001600160a01b0384169190610ca3565b50806108808161120b565b9150506107b3565b60006108946001610cf5565b905080156108ac576000805461ff0019166101001790555b6001600160a01b0383166109025760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207365742061646d696e20746f207a65726f2061646472657373006044820152606401610351565b61090b83610bee565b61091482610321565b801561077b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b426004541161099f5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f662077696e646f7760981b6044820152606401610351565b60005b8181101561077b5760008383838181106109be576109be6111df565b90506020020160208101906109d3919061110b565b33600090815260016020526040812091925090818686868181106109f9576109f96111df565b9050602002016020810190610a0e919061110b565b6001600160a01b0316815260208101919091526040016000205490508015610bd95733600090815260016020526040812090868686818110610a5257610a526111df565b9050602002016020810190610a67919061110b565b6001600160a01b0316815260208082019290925260409081016000908120819055338152600290925281208291878787818110610aa657610aa66111df565b9050602002016020810190610abb919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610aea91906112af565b9091555081905060036000878787818110610b0757610b076111df565b9050602002016020810190610b1c919061110b565b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254610b4b91906112e0565b90915550610b6590506001600160a01b0383163383610ca3565b7f8bd0db04d7d748ae70a6a244675345c05f70e540f344927714da92f35b2418ce33868686818110610b9957610b996111df565b9050602002016020810190610bae919061110b565b604080516001600160a01b039384168152929091166020830152810183905260600160405180910390a15b50508080610be69061120b565b9150506109a2565b6001600160a01b038116610c4e5760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b6064820152608401610351565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261077b908490610d7d565b60008054610100900460ff1615610d3c578160ff166001148015610d185750303b155b610d345760405162461bcd60e51b8152600401610351906112f7565b506000919050565b60005460ff808416911610610d635760405162461bcd60e51b8152600401610351906112f7565b506000805460ff191660ff92909216919091179055600190565b6000610dd2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e4f9092919063ffffffff16565b80519091501561077b5780806020019051810190610df09190611345565b61077b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610351565b6060610e5e8484600085610e68565b90505b9392505050565b606082471015610ec95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610351565b6001600160a01b0385163b610f205760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610351565b600080866001600160a01b03168587604051610f3c9190611367565b60006040518083038185875af1925050503d8060008114610f79576040519150601f19603f3d011682016040523d82523d6000602084013e610f7e565b606091505b5091509150610f8e828286610f99565b979650505050505050565b60608315610fa8575081610e61565b825115610fb85782518084602001fd5b8160405162461bcd60e51b8152600401610351919061127c565b6001600160a01b03811681146103de57600080fd5b60008060408385031215610ffa57600080fd5b823561100581610fd2565b9150602083013561101581610fd2565b809150509250929050565b60008083601f84011261103257600080fd5b50813567ffffffffffffffff81111561104a57600080fd5b6020830191508360208260051b850101111561106557600080fd5b9250929050565b6000806020838503121561107f57600080fd5b823567ffffffffffffffff81111561109657600080fd5b6110a285828601611020565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b818110156110e6578351835292840192918401916001016110ca565b50909695505050505050565b60006020828403121561110457600080fd5b5035919050565b60006020828403121561111d57600080fd5b8135610e6181610fd2565b6000806020838503121561113b57600080fd5b823567ffffffffffffffff8082111561115357600080fd5b818501915085601f83011261116757600080fd5b81358181111561117657600080fd5b86602060608302850101111561118b57600080fd5b60209290920196919550909350505050565b600080604083850312156111b057600080fd5b82356111bb81610fd2565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561121f5761121f6111f5565b5060010190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60005b8381101561126757818101518382015260200161124f565b83811115611276576000848401525b50505050565b602081526000825180602084015261129b81604085016020870161124c565b601f01601f19169190910160400192915050565b600082198211156112c2576112c26111f5565b500190565b6000602082840312156112d957600080fd5b5051919050565b6000828210156112f2576112f26111f5565b500390565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60006020828403121561135757600080fd5b81518015158114610e6157600080fd5b6000825161137981846020870161124c565b919091019291505056fea26469706673582212201a371d8c26e9835bdf1c431a29f2afec84f77ca22889db0485227d008775e97a64736f6c63430008090033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 6, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 9, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 696, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "admin", - "offset": 2, - "slot": "0", - "type": "t_address" - }, - { - "astId": 768, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "userRetrievableTokenMap", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" - }, - { - "astId": 774, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "userRetrievedTokenMap", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" - }, - { - "astId": 778, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "remainTokenMap", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 780, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "endingAt", - "offset": 0, - "slot": "4", - "type": "t_uint256" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - } -} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Proxy.json b/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Proxy.json deleted file mode 100644 index cc79002..0000000 --- a/packages/bonds/deployments/bsc/AccidentHandler20220715V3_Proxy.json +++ /dev/null @@ -1,244 +0,0 @@ -{ - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "abi": [ - { - "inputs": [ - { - "internalType": "address", - "name": "implementationAddress", - "type": "address" - }, - { - "internalType": "address", - "name": "ownerAddress", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousImplementation", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "ProxyImplementationUpdated", - "type": "event" - }, - { - "stateMutability": "payable", - "type": "fallback" - }, - { - "inputs": [], - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "id", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - } - ], - "name": "upgradeTo", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "upgradeToAndCall", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "stateMutability": "payable", - "type": "receive" - } - ], - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "receipt": { - "to": null, - "from": "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", - "contractAddress": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "transactionIndex": 52, - "gasUsed": "692905", - "logsBloom": "0x00000000000000000000000000000000002000000000004000800000000000000010000000000000000400000000000000000000000000000000000000000000001000000000000000000040000000000001000000000000000600000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000180000000000000000000000040000000000000000000000600000000000000000000000000000000000000000000000000000000000000050000000000000000000004000000000020000000000000000000000400000000000000000000000000000000000000000000", - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec", - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "logs": [ - { - "transactionIndex": 52, - "blockNumber": 20354295, - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "topics": [ - "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000765675852c05d358b6c5b9edf30da8b36ebd9b66" - ], - "data": "0x", - "logIndex": 176, - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" - }, - { - "transactionIndex": 52, - "blockNumber": 20354295, - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "topics": [ - "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", - "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf", - "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf" - ], - "data": "0x", - "logIndex": 177, - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" - }, - { - "transactionIndex": 52, - "blockNumber": 20354295, - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 178, - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" - }, - { - "transactionIndex": 52, - "blockNumber": 20354295, - "transactionHash": "0xde7b4f99927e835e5aa2f9304d5cc9925a84aa8c9a59a3d60e0a6d0a2805c259", - "address": "0x0b30F2e19a63f2dDF8eF87093f14284cB6Ae188f", - "topics": [ - "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf" - ], - "data": "0x", - "logIndex": 179, - "blockHash": "0xa0690d26fa692202d975334299be6f0cddcb30e55455f39965e98a1f02d70cec" - } - ], - "blockNumber": 20354295, - "cumulativeGasUsed": "7296349", - "status": 1, - "byzantium": true - }, - "args": [ - "0x765675852C05d358B6c5B9EdF30Da8b36EBD9B66", - "0x00d7A6a2F161d3f4971a3d1B071Ef55b284FD3Bf", - "0xcd6dc68700000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf000000000000000000000000000000000000000000000000000000006345aef5" - ], - "numDeployments": 1, - "solcInputHash": "41a8600e180880fe88609322a6b2ac21", - "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/proxy/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/proxy/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n constructor(\\n address implementationAddress,\\n address ownerAddress,\\n bytes memory data\\n ) payable {\\n _setImplementation(implementationAddress, data);\\n _setOwner(ownerAddress);\\n }\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xb9c14a66c8a4eefabca13cc8dd8133c1587909bb1124fa793c50ab46358b63e4\",\"license\":\"MIT\"},\"solc_0.8/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 {\\n revert(0, retSz)\\n }\\n default {\\n return(0, retSz)\\n }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success, ) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x68c8cf1a340a53d31de8ed808bb66d64e83d50b20d80a0b2dff6aba903cebc98\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x608060405260405162000ccc38038062000ccc8339810160408190526200002691620001fc565b62000032838262000046565b6200003d8262000128565b505050620002fa565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511562000123576000836001600160a01b031683604051620000ca9190620002dc565b600060405180830381855af49150503d806000811462000107576040519150601f19603f3d011682016040523d82523d6000602084013e6200010c565b606091505b505090508062000121573d806000803e806000fd5b505b505050565b60006200014260008051602062000cac8339815191525490565b90508160008051602062000cac83398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80516001600160a01b0381168114620001b257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001ea578181015183820152602001620001d0565b83811115620001215750506000910152565b6000806000606084860312156200021257600080fd5b6200021d846200019a565b92506200022d602085016200019a565b60408501519092506001600160401b03808211156200024b57600080fd5b818601915086601f8301126200026057600080fd5b815181811115620002755762000275620001b7565b604051601f8201601f19908116603f01168101908382118183101715620002a057620002a0620001b7565b81604052828152896020848701011115620002ba57600080fd5b620002cd836020830160208801620001cd565b80955050505050509250925092565b60008251620002f0818460208701620001cd565b9190910192915050565b6109a2806200030a6000396000f3fe60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", - "deployedBytecode": "0x60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "notice": "Proxy implementing EIP173 for ownership management", - "version": 1 - }, - "storageLayout": { - "storage": [], - "types": null - } -} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/solcInputs/123cc147802b234c976c6c4db54070fc.json b/packages/bonds/deployments/bsc/solcInputs/123cc147802b234c976c6c4db54070fc.json deleted file mode 100644 index 9515982..0000000 --- a/packages/bonds/deployments/bsc/solcInputs/123cc147802b234c976c6c4db54070fc.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/AccidentHandler20220715V3.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\npragma abicoder v2;\n\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\nimport \"@private/shared/libs/Adminable.sol\";\n\n\ncontract AccidentHandler20220715V3 is Initializable, Adminable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n // [user]: [token]: amount # retrievable\n mapping(address => mapping(address => uint)) public userRetrievableTokenMap;\n // [user]: [token]: amount # retrieved\n mapping(address => mapping(address => uint)) public userRetrievedTokenMap;\n // [token]: amount # retrievable\n mapping(address => uint) public remainTokenMap;\n\n uint public endingAt;\n\n event Retrieve(address user, address token, uint amount);\n\n struct Record {\n address user;\n address token;\n uint amount;\n }\n\n function initialize(address admin_, uint endingAt_) public initializer {\n require(admin_ != address(0), \"Can't set admin to zero address\");\n _setAdmin(admin_);\n setEndingAt(endingAt_);\n }\n\n function retrievables(address[] calldata tokens) external view returns (uint[] memory) {\n uint[] memory amounts = new uint[](tokens.length);\n for (uint i; i < tokens.length; i++) {\n amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]];\n }\n return amounts;\n }\n\n function retrieved(address[] calldata tokens) external view returns (uint[] memory) {\n uint[] memory amounts = new uint[](tokens.length);\n for (uint i; i < tokens.length; i++) {\n amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]];\n }\n return amounts;\n }\n\n function setRecords(Record[] calldata records_) external onlyAdmin {\n for (uint i; i < records_.length; i++) {\n Record calldata record = records_[i];\n if (record.amount <= 0) {\n continue;\n }\n require(userRetrievableTokenMap[record.user][record.token] == 0\n && userRetrievedTokenMap[record.user][record.token] == 0,\n string(abi.encodePacked(\"Can not set twice for user\", record.user, \", token:\", record.token))\n );\n userRetrievableTokenMap[record.user][record.token] += record.amount;\n remainTokenMap[record.token] += record.amount;\n }\n }\n\n function setEndingAt(uint endingAt_) public onlyAdmin {\n require(endingAt_ > 0, \"Invalid ending time\");\n endingAt = endingAt_;\n }\n\n function retrieveTokens(address[] calldata tokens) external {\n require(endingAt > block.timestamp, \"Out of window\");\n for (uint i; i < tokens.length; i++) {\n IERC20Upgradeable token = IERC20Upgradeable(tokens[i]);\n uint amount = userRetrievableTokenMap[msg.sender][tokens[i]];\n if (amount > 0) {\n delete userRetrievableTokenMap[msg.sender][tokens[i]];\n userRetrievedTokenMap[msg.sender][tokens[i]] += amount;\n remainTokenMap[tokens[i]] -= amount;\n token.safeTransfer(msg.sender, amount);\n emit Retrieve(msg.sender, tokens[i], amount);\n }\n }\n }\n\n function transferTokens(IERC20Upgradeable[] calldata tokens_) public onlyAdmin {\n for (uint256 i = 0; i < tokens_.length; i++) {\n IERC20Upgradeable token = tokens_[i];\n token.safeTransfer(msg.sender, token.balanceOf(address(this)));\n }\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n */\n modifier initializer() {\n bool isTopLevelCall = _setInitializedVersion(1);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n * initialization step. This is essential to configure modules that are added through upgrades and that require\n * initialization.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n */\n modifier reinitializer(uint8 version) {\n bool isTopLevelCall = _setInitializedVersion(version);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(version);\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n */\n function _disableInitializers() internal virtual {\n _setInitializedVersion(type(uint8).max);\n }\n\n function _setInitializedVersion(uint8 version) private returns (bool) {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\n // of initializers, because in other contexts the contract may have been reentered.\n if (_initializing) {\n require(\n version == 1 && !AddressUpgradeable.isContract(address(this)),\n \"Initializable: contract is already initialized\"\n );\n return false;\n } else {\n require(_initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n return true;\n }\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n function safeTransfer(\n IERC20Upgradeable token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20Upgradeable token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" - }, - "@private/shared/libs/Adminable.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nabstract contract Adminable {\n event AdminUpdated(address indexed user, address indexed newAdmin);\n\n address public admin;\n\n modifier onlyAdmin() virtual {\n require(msg.sender == admin, \"UNAUTHORIZED\");\n\n _;\n }\n\n function setAdmin(address newAdmin) public virtual onlyAdmin {\n _setAdmin(newAdmin);\n }\n\n function _setAdmin(address newAdmin) internal {\n require(newAdmin != address(0), \"Can not set admin to zero address\");\n admin = newAdmin;\n\n emit AdminUpdated(msg.sender, newAdmin);\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "storageLayout", - "devdoc", - "userdoc", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "libraries": { - "": { - "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1" - } - } - } -} \ No newline at end of file diff --git a/packages/bonds/deployments/bsc/solcInputs/41a8600e180880fe88609322a6b2ac21.json b/packages/bonds/deployments/bsc/solcInputs/41a8600e180880fe88609322a6b2ac21.json deleted file mode 100644 index 4c1fe6d..0000000 --- a/packages/bonds/deployments/bsc/solcInputs/41a8600e180880fe88609322a6b2ac21.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "solc_0.8/proxy/EIP173Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./Proxy.sol\";\n\ninterface ERC165 {\n function supportsInterface(bytes4 id) external view returns (bool);\n}\n\n///@notice Proxy implementing EIP173 for ownership management\ncontract EIP173Proxy is Proxy {\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\n\n constructor(\n address implementationAddress,\n address ownerAddress,\n bytes memory data\n ) payable {\n _setImplementation(implementationAddress, data);\n _setOwner(ownerAddress);\n }\n\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\n\n function owner() external view returns (address) {\n return _owner();\n }\n\n function supportsInterface(bytes4 id) external view returns (bool) {\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\n return true;\n }\n if (id == 0xFFFFFFFF) {\n return false;\n }\n\n ERC165 implementation;\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\n }\n\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\n // In practise this is unlikely to be an issue.\n try implementation.supportsInterface(id) returns (bool support) {\n return support;\n } catch {\n return false;\n }\n }\n\n function transferOwnership(address newOwner) external onlyOwner {\n _setOwner(newOwner);\n }\n\n function upgradeTo(address newImplementation) external onlyOwner {\n _setImplementation(newImplementation, \"\");\n }\n\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\n _setImplementation(newImplementation, data);\n }\n\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\n\n modifier onlyOwner() {\n require(msg.sender == _owner(), \"NOT_AUTHORIZED\");\n _;\n }\n\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\n\n function _owner() internal view returns (address adminAddress) {\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\n }\n }\n\n function _setOwner(address newOwner) internal {\n address previousOwner = _owner();\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\n }\n emit OwnershipTransferred(previousOwner, newOwner);\n }\n}\n" - }, - "solc_0.8/proxy/Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// EIP-1967\nabstract contract Proxy {\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\n\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\n\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\n\n receive() external payable virtual {\n revert(\"ETHER_REJECTED\"); // explicit reject by default\n }\n\n fallback() external payable {\n _fallback();\n }\n\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\n\n function _fallback() internal {\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\n calldatacopy(0x0, 0x0, calldatasize())\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\n let retSz := returndatasize()\n returndatacopy(0, 0, retSz)\n switch success\n case 0 {\n revert(0, retSz)\n }\n default {\n return(0, retSz)\n }\n }\n }\n\n function _setImplementation(address newImplementation, bytes memory data) internal {\n address previousImplementation;\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\n }\n\n // solhint-disable-next-line security/no-inline-assembly\n assembly {\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\n }\n\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\n\n if (data.length > 0) {\n (bool success, ) = newImplementation.delegatecall(data);\n if (!success) {\n assembly {\n // This assembly ensure the revert contains the exact string data\n let returnDataSize := returndatasize()\n returndatacopy(0, 0, returnDataSize)\n revert(0, returnDataSize)\n }\n }\n }\n }\n}\n" - }, - "solc_0.8/proxy/EIP173ProxyWithReceive.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./EIP173Proxy.sol\";\n\n///@notice Proxy implementing EIP173 for ownership management that accept ETH via receive\ncontract EIP173ProxyWithReceive is EIP173Proxy {\n constructor(\n address implementationAddress,\n address ownerAddress,\n bytes memory data\n ) payable EIP173Proxy(implementationAddress, ownerAddress, data) {}\n\n receive() external payable override {}\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 999999 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/.extraMeta/AccidentHandler20220715V3.json b/packages/bonds/deployments/bsctest/.extraMeta/AccidentHandler20220715V3.json deleted file mode 100644 index ed332ea..0000000 --- a/packages/bonds/deployments/bsctest/.extraMeta/AccidentHandler20220715V3.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "class": "AccidentHandler20220715V3", - "instance": "AccidentHandler20220715V3" -} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/.extraMeta/BondFactory.json b/packages/bonds/deployments/bsctest/.extraMeta/BondFactory.json new file mode 100644 index 0000000..83674dc --- /dev/null +++ b/packages/bonds/deployments/bsctest/.extraMeta/BondFactory.json @@ -0,0 +1,4 @@ +{ + "class": "BondFactory", + "instance": "BondFactory" +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/.extraMeta/DiscountBond.json b/packages/bonds/deployments/bsctest/.extraMeta/DiscountBond.json new file mode 100644 index 0000000..c604d08 --- /dev/null +++ b/packages/bonds/deployments/bsctest/.extraMeta/DiscountBond.json @@ -0,0 +1,4 @@ +{ + "class": "DiscountBond", + "instance": "DiscountBond" +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/.extraMeta/DuetTransparentUpgradeableProxy.json b/packages/bonds/deployments/bsctest/.extraMeta/DuetTransparentUpgradeableProxy.json new file mode 100644 index 0000000..2bce8d7 --- /dev/null +++ b/packages/bonds/deployments/bsctest/.extraMeta/DuetTransparentUpgradeableProxy.json @@ -0,0 +1,4 @@ +{ + "class": "DuetTransparentUpgradeableProxy", + "instance": "DuetTransparentUpgradeableProxy" +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Implementation.json b/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Implementation.json deleted file mode 100644 index e2d1e94..0000000 --- a/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Implementation.json +++ /dev/null @@ -1,408 +0,0 @@ -{ - "address": "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", - "abi": [ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint8", - "name": "version", - "type": "uint8" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Retrieve", - "type": "event" - }, - { - "inputs": [], - "name": "admin", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "endingAt", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "admin_", - "type": "address" - }, - { - "internalType": "uint256", - "name": "endingAt_", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "remainTokenMap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "name": "retrievables", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "name": "retrieveTokens", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" - } - ], - "name": "retrieved", - "outputs": [ - { - "internalType": "uint256[]", - "name": "", - "type": "uint256[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "setAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "endingAt_", - "type": "uint256" - } - ], - "name": "setEndingAt", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct AccidentHandler20220715V3.Record[]", - "name": "records_", - "type": "tuple[]" - } - ], - "name": "setRecords", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRetrievableTokenMap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - }, - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "name": "userRetrievedTokenMap", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - } - ], - "transactionHash": "0xcda4799d9f61363b81803a028db38ac1095e62be57c6652e6534cc78203d1713", - "receipt": { - "to": null, - "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", - "contractAddress": "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", - "transactionIndex": 5, - "gasUsed": "974274", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xfbca26fbae07a54a93f7aa54af46123ce0a2cc65b42bb40c96102ef367a84152", - "transactionHash": "0xcda4799d9f61363b81803a028db38ac1095e62be57c6652e6534cc78203d1713", - "logs": [], - "blockNumber": 21796286, - "cumulativeGasUsed": "2291197", - "status": 1, - "byzantium": true - }, - "args": [], - "numDeployments": 1, - "solcInputHash": "c64de78500c453458ed62a1018d284a7", - "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Retrieve\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endingAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"endingAt_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"remainTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrievables\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrieveTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"retrieved\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"endingAt_\",\"type\":\"uint256\"}],\"name\":\"setEndingAt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"struct AccidentHandler20220715V3.Record[]\",\"name\":\"records_\",\"type\":\"tuple[]\"}],\"name\":\"setRecords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userRetrievableTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userRetrievedTokenMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/AccidentHandler20220715V3.sol\":\"AccidentHandler20220715V3\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n function safeTransfer(\\n IERC20Upgradeable token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20Upgradeable token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3e26a49d2fa5ef8338b8a9467c91e54f417cb07e849b1cc0f4ebc4d2a147938e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@private/shared/libs/Adminable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nabstract contract Adminable {\\n event AdminUpdated(address indexed user, address indexed newAdmin);\\n\\n address public admin;\\n\\n modifier onlyAdmin() virtual {\\n require(msg.sender == admin, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n function setAdmin(address newAdmin) public virtual onlyAdmin {\\n _setAdmin(newAdmin);\\n }\\n\\n function _setAdmin(address newAdmin) internal {\\n require(newAdmin != address(0), \\\"Can not set admin to zero address\\\");\\n admin = newAdmin;\\n\\n emit AdminUpdated(msg.sender, newAdmin);\\n }\\n}\\n\",\"keccak256\":\"0xe47c97c0e3edad2d1df3e664376a7bb46e1aaf51b4c4acc73c4a2cfdc747185f\",\"license\":\"GPL-3.0\"},\"contracts/AccidentHandler20220715V3.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\npragma abicoder v2;\\n\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\nimport \\\"@private/shared/libs/Adminable.sol\\\";\\n\\n\\ncontract AccidentHandler20220715V3 is Initializable, Adminable {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n\\n // [user]: [token]: amount # retrievable\\n mapping(address => mapping(address => uint)) public userRetrievableTokenMap;\\n // [user]: [token]: amount # retrieved\\n mapping(address => mapping(address => uint)) public userRetrievedTokenMap;\\n // [token]: amount # retrievable\\n mapping(address => uint) public remainTokenMap;\\n\\n uint public endingAt;\\n\\n event Retrieve(address user, address token, uint amount);\\n struct Record {\\n address user;\\n address token;\\n uint amount;\\n }\\n\\n function initialize(address admin_, uint endingAt_) public initializer {\\n require(admin_ != address(0), \\\"Can't set admin to zero address\\\");\\n _setAdmin(admin_);\\n setEndingAt(endingAt_);\\n }\\n\\n function retrievables(address[] calldata tokens) external view returns (uint[] memory) {\\n uint[] memory amounts = new uint[](tokens.length);\\n for (uint i; i < tokens.length; i++) {\\n amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]];\\n }\\n return amounts;\\n }\\n\\n function retrieved(address[] calldata tokens) external view returns (uint[] memory) {\\n uint[] memory amounts = new uint[](tokens.length);\\n for (uint i; i < tokens.length; i++) {\\n amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]];\\n }\\n return amounts;\\n }\\n\\n function setRecords(Record[] calldata records_) external onlyAdmin {\\n for (uint i; i < records_.length; i++) {\\n Record calldata record = records_[i];\\n userRetrievableTokenMap[record.user][record.token] += record.amount;\\n remainTokenMap[record.token] += record.amount;\\n }\\n }\\n\\n function setEndingAt(uint endingAt_) public onlyAdmin {\\n require(endingAt_ != 0 && endingAt_ > block.timestamp, \\\"Invalid ending time\\\");\\n endingAt = endingAt_;\\n }\\n\\n function retrieveTokens(address[] calldata tokens) external {\\n require(endingAt > block.timestamp, \\\"Out of window\\\");\\n for (uint i; i < tokens.length; i++) {\\n IERC20Upgradeable token = IERC20Upgradeable(tokens[i]);\\n uint amount = userRetrievableTokenMap[msg.sender][tokens[i]];\\n if (amount > 0) {\\n delete userRetrievableTokenMap[msg.sender][tokens[i]];\\n userRetrievedTokenMap[msg.sender][tokens[i]] += amount;\\n remainTokenMap[tokens[i]] -= amount;\\n token.safeTransfer(msg.sender, amount);\\n emit Retrieve(msg.sender, tokens[i], amount);\\n }\\n }\\n }\\n\\n}\\n\",\"keccak256\":\"0xaec4361f8420d2f9f1986fbba38b3df674e76a2272e50027e203eb66c1167d97\",\"license\":\"GPL-3.0\"}},\"version\":1}", - "bytecode": "0x608060405234801561001057600080fd5b506110aa806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80639a22d5a6116100715780639a22d5a61461017d578063c23b498814610190578063cd6dc68714610199578063e797e9ef146101ac578063f1a0d18b146101bf578063f851a440146101df57600080fd5b80632d915022146100b957806336463706146100f75780635ab2fd3214610117578063704b6c021461012c57806376de352d1461013f5780637fa3b3da14610152575b600080fd5b6100e46100c7366004610d26565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61010a610105366004610d59565b610210565b6040516100ee9190610dce565b61012a610125366004610e12565b6102f3565b005b61012a61013a366004610e2b565b610381565b61010a61014d366004610d59565b6103bd565b6100e4610160366004610d26565b600160209081526000928352604080842090915290825290205481565b61012a61018b366004610e46565b610498565b6100e460045481565b61012a6101a7366004610ea9565b6105d7565b61012a6101ba366004610d59565b6106ad565b6100e46101cd366004610e2b565b60036020526000908152604090205481565b6000546101f8906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016100ee565b606060008267ffffffffffffffff81111561022d5761022d610ed3565b604051908082528060200260200182016040528015610256578160200160208202803683370190505b50905060005b838110156102eb573360009081526001602052604081209086868481811061028657610286610ee9565b905060200201602081019061029b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106102ce576102ce610ee9565b6020908102919091010152806102e381610f15565b91505061025c565b509392505050565b6000546201000090046001600160a01b0316331461032c5760405162461bcd60e51b815260040161032390610f30565b60405180910390fd5b801580159061033a57504281115b61037c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420656e64696e672074696d6560681b6044820152606401610323565b600455565b6000546201000090046001600160a01b031633146103b15760405162461bcd60e51b815260040161032390610f30565b6103ba8161093d565b50565b606060008267ffffffffffffffff8111156103da576103da610ed3565b604051908082528060200260200182016040528015610403578160200160208202803683370190505b50905060005b838110156102eb573360009081526002602052604081209086868481811061043357610433610ee9565b90506020020160208101906104489190610e2b565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061047b5761047b610ee9565b60209081029190910101528061049081610f15565b915050610409565b6000546201000090046001600160a01b031633146104c85760405162461bcd60e51b815260040161032390610f30565b60005b818110156105d257368383838181106104e6576104e6610ee9565b606002919091019150506040810135600160006105066020850185610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600083602001602081019061053b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461056a9190610f56565b9091555050604081018035906003906000906105899060208601610e2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546105b89190610f56565b909155508291506105ca905081610f15565b9150506104cb565b505050565b60006105e360016109f2565b905080156105fb576000805461ff0019166101001790555b6001600160a01b0383166106515760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207365742061646d696e20746f207a65726f2061646472657373006044820152606401610323565b61065a8361093d565b610663826102f3565b80156105d2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b42600454116106ee5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f662077696e646f7760981b6044820152606401610323565b60005b818110156105d257600083838381811061070d5761070d610ee9565b90506020020160208101906107229190610e2b565b336000908152600160205260408120919250908186868681811061074857610748610ee9565b905060200201602081019061075d9190610e2b565b6001600160a01b031681526020810191909152604001600020549050801561092857336000908152600160205260408120908686868181106107a1576107a1610ee9565b90506020020160208101906107b69190610e2b565b6001600160a01b03168152602080820192909252604090810160009081208190553381526002909252812082918787878181106107f5576107f5610ee9565b905060200201602081019061080a9190610e2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546108399190610f56565b909155508190506003600087878781811061085657610856610ee9565b905060200201602081019061086b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461089a9190610f6e565b909155506108b490506001600160a01b0383163383610a7f565b7f8bd0db04d7d748ae70a6a244675345c05f70e540f344927714da92f35b2418ce338686868181106108e8576108e8610ee9565b90506020020160208101906108fd9190610e2b565b604080516001600160a01b039384168152929091166020830152810183905260600160405180910390a15b5050808061093590610f15565b9150506106f1565b6001600160a01b03811661099d5760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b6064820152608401610323565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff1615610a39578160ff166001148015610a155750303b155b610a315760405162461bcd60e51b815260040161032390610f85565b506000919050565b60005460ff808416911610610a605760405162461bcd60e51b815260040161032390610f85565b506000805460ff191660ff92909216919091179055600190565b919050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526105d292869291600091610b0f918516908490610b8c565b8051909150156105d25780806020019051810190610b2d9190610fd3565b6105d25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610323565b6060610b9b8484600085610ba5565b90505b9392505050565b606082471015610c065760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610323565b6001600160a01b0385163b610c5d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610323565b600080866001600160a01b03168587604051610c799190611025565b60006040518083038185875af1925050503d8060008114610cb6576040519150601f19603f3d011682016040523d82523d6000602084013e610cbb565b606091505b5091509150610ccb828286610cd6565b979650505050505050565b60608315610ce5575081610b9e565b825115610cf55782518084602001fd5b8160405162461bcd60e51b81526004016103239190611041565b80356001600160a01b0381168114610a7a57600080fd5b60008060408385031215610d3957600080fd5b610d4283610d0f565b9150610d5060208401610d0f565b90509250929050565b60008060208385031215610d6c57600080fd5b823567ffffffffffffffff80821115610d8457600080fd5b818501915085601f830112610d9857600080fd5b813581811115610da757600080fd5b8660208260051b8501011115610dbc57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015610e0657835183529284019291840191600101610dea565b50909695505050505050565b600060208284031215610e2457600080fd5b5035919050565b600060208284031215610e3d57600080fd5b610b9e82610d0f565b60008060208385031215610e5957600080fd5b823567ffffffffffffffff80821115610e7157600080fd5b818501915085601f830112610e8557600080fd5b813581811115610e9457600080fd5b866020606083028501011115610dbc57600080fd5b60008060408385031215610ebc57600080fd5b610ec583610d0f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415610f2957610f29610eff565b5060010190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60008219821115610f6957610f69610eff565b500190565b600082821015610f8057610f80610eff565b500390565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215610fe557600080fd5b81518015158114610b9e57600080fd5b60005b83811015611010578181015183820152602001610ff8565b8381111561101f576000848401525b50505050565b60008251611037818460208701610ff5565b9190910192915050565b6020815260008251806020840152611060816040850160208701610ff5565b601f01601f1916919091016040019291505056fea2646970667358221220b63c1f900c9f3a0830eaf226383d62da42e77d9feb8fe0cdd092528162e1e38264736f6c63430008090033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80639a22d5a6116100715780639a22d5a61461017d578063c23b498814610190578063cd6dc68714610199578063e797e9ef146101ac578063f1a0d18b146101bf578063f851a440146101df57600080fd5b80632d915022146100b957806336463706146100f75780635ab2fd3214610117578063704b6c021461012c57806376de352d1461013f5780637fa3b3da14610152575b600080fd5b6100e46100c7366004610d26565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b61010a610105366004610d59565b610210565b6040516100ee9190610dce565b61012a610125366004610e12565b6102f3565b005b61012a61013a366004610e2b565b610381565b61010a61014d366004610d59565b6103bd565b6100e4610160366004610d26565b600160209081526000928352604080842090915290825290205481565b61012a61018b366004610e46565b610498565b6100e460045481565b61012a6101a7366004610ea9565b6105d7565b61012a6101ba366004610d59565b6106ad565b6100e46101cd366004610e2b565b60036020526000908152604090205481565b6000546101f8906201000090046001600160a01b031681565b6040516001600160a01b0390911681526020016100ee565b606060008267ffffffffffffffff81111561022d5761022d610ed3565b604051908082528060200260200182016040528015610256578160200160208202803683370190505b50905060005b838110156102eb573360009081526001602052604081209086868481811061028657610286610ee9565b905060200201602081019061029b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106102ce576102ce610ee9565b6020908102919091010152806102e381610f15565b91505061025c565b509392505050565b6000546201000090046001600160a01b0316331461032c5760405162461bcd60e51b815260040161032390610f30565b60405180910390fd5b801580159061033a57504281115b61037c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420656e64696e672074696d6560681b6044820152606401610323565b600455565b6000546201000090046001600160a01b031633146103b15760405162461bcd60e51b815260040161032390610f30565b6103ba8161093d565b50565b606060008267ffffffffffffffff8111156103da576103da610ed3565b604051908082528060200260200182016040528015610403578160200160208202803683370190505b50905060005b838110156102eb573360009081526002602052604081209086868481811061043357610433610ee9565b90506020020160208101906104489190610e2b565b6001600160a01b03166001600160a01b031681526020019081526020016000205482828151811061047b5761047b610ee9565b60209081029190910101528061049081610f15565b915050610409565b6000546201000090046001600160a01b031633146104c85760405162461bcd60e51b815260040161032390610f30565b60005b818110156105d257368383838181106104e6576104e6610ee9565b606002919091019150506040810135600160006105066020850185610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600083602001602081019061053b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461056a9190610f56565b9091555050604081018035906003906000906105899060208601610e2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546105b89190610f56565b909155508291506105ca905081610f15565b9150506104cb565b505050565b60006105e360016109f2565b905080156105fb576000805461ff0019166101001790555b6001600160a01b0383166106515760405162461bcd60e51b815260206004820152601f60248201527f43616e2774207365742061646d696e20746f207a65726f2061646472657373006044820152606401610323565b61065a8361093d565b610663826102f3565b80156105d2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b42600454116106ee5760405162461bcd60e51b815260206004820152600d60248201526c4f7574206f662077696e646f7760981b6044820152606401610323565b60005b818110156105d257600083838381811061070d5761070d610ee9565b90506020020160208101906107229190610e2b565b336000908152600160205260408120919250908186868681811061074857610748610ee9565b905060200201602081019061075d9190610e2b565b6001600160a01b031681526020810191909152604001600020549050801561092857336000908152600160205260408120908686868181106107a1576107a1610ee9565b90506020020160208101906107b69190610e2b565b6001600160a01b03168152602080820192909252604090810160009081208190553381526002909252812082918787878181106107f5576107f5610ee9565b905060200201602081019061080a9190610e2b565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546108399190610f56565b909155508190506003600087878781811061085657610856610ee9565b905060200201602081019061086b9190610e2b565b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461089a9190610f6e565b909155506108b490506001600160a01b0383163383610a7f565b7f8bd0db04d7d748ae70a6a244675345c05f70e540f344927714da92f35b2418ce338686868181106108e8576108e8610ee9565b90506020020160208101906108fd9190610e2b565b604080516001600160a01b039384168152929091166020830152810183905260600160405180910390a15b5050808061093590610f15565b9150506106f1565b6001600160a01b03811661099d5760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b6064820152608401610323565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff1615610a39578160ff166001148015610a155750303b155b610a315760405162461bcd60e51b815260040161032390610f85565b506000919050565b60005460ff808416911610610a605760405162461bcd60e51b815260040161032390610f85565b506000805460ff191660ff92909216919091179055600190565b919050565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526105d292869291600091610b0f918516908490610b8c565b8051909150156105d25780806020019051810190610b2d9190610fd3565b6105d25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610323565b6060610b9b8484600085610ba5565b90505b9392505050565b606082471015610c065760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610323565b6001600160a01b0385163b610c5d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610323565b600080866001600160a01b03168587604051610c799190611025565b60006040518083038185875af1925050503d8060008114610cb6576040519150601f19603f3d011682016040523d82523d6000602084013e610cbb565b606091505b5091509150610ccb828286610cd6565b979650505050505050565b60608315610ce5575081610b9e565b825115610cf55782518084602001fd5b8160405162461bcd60e51b81526004016103239190611041565b80356001600160a01b0381168114610a7a57600080fd5b60008060408385031215610d3957600080fd5b610d4283610d0f565b9150610d5060208401610d0f565b90509250929050565b60008060208385031215610d6c57600080fd5b823567ffffffffffffffff80821115610d8457600080fd5b818501915085601f830112610d9857600080fd5b813581811115610da757600080fd5b8660208260051b8501011115610dbc57600080fd5b60209290920196919550909350505050565b6020808252825182820181905260009190848201906040850190845b81811015610e0657835183529284019291840191600101610dea565b50909695505050505050565b600060208284031215610e2457600080fd5b5035919050565b600060208284031215610e3d57600080fd5b610b9e82610d0f565b60008060208385031215610e5957600080fd5b823567ffffffffffffffff80821115610e7157600080fd5b818501915085601f830112610e8557600080fd5b813581811115610e9457600080fd5b866020606083028501011115610dbc57600080fd5b60008060408385031215610ebc57600080fd5b610ec583610d0f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415610f2957610f29610eff565b5060010190565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60008219821115610f6957610f69610eff565b500190565b600082821015610f8057610f80610eff565b500390565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215610fe557600080fd5b81518015158114610b9e57600080fd5b60005b83811015611010578181015183820152602001610ff8565b8381111561101f576000848401525b50505050565b60008251611037818460208701610ff5565b9190910192915050565b6020815260008251806020840152611060816040850160208701610ff5565b601f01601f1916919091016040019291505056fea2646970667358221220b63c1f900c9f3a0830eaf226383d62da42e77d9feb8fe0cdd092528162e1e38264736f6c63430008090033", - "devdoc": { - "kind": "dev", - "methods": {}, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": {}, - "version": 1 - }, - "storageLayout": { - "storage": [ - { - "astId": 6, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "_initialized", - "offset": 0, - "slot": "0", - "type": "t_uint8" - }, - { - "astId": 9, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "_initializing", - "offset": 1, - "slot": "0", - "type": "t_bool" - }, - { - "astId": 696, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "admin", - "offset": 2, - "slot": "0", - "type": "t_address" - }, - { - "astId": 768, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "userRetrievableTokenMap", - "offset": 0, - "slot": "1", - "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" - }, - { - "astId": 774, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "userRetrievedTokenMap", - "offset": 0, - "slot": "2", - "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" - }, - { - "astId": 778, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "remainTokenMap", - "offset": 0, - "slot": "3", - "type": "t_mapping(t_address,t_uint256)" - }, - { - "astId": 780, - "contract": "contracts/AccidentHandler20220715V3.sol:AccidentHandler20220715V3", - "label": "endingAt", - "offset": 0, - "slot": "4", - "type": "t_uint256" - } - ], - "types": { - "t_address": { - "encoding": "inplace", - "label": "address", - "numberOfBytes": "20" - }, - "t_bool": { - "encoding": "inplace", - "label": "bool", - "numberOfBytes": "1" - }, - "t_mapping(t_address,t_mapping(t_address,t_uint256))": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => mapping(address => uint256))", - "numberOfBytes": "32", - "value": "t_mapping(t_address,t_uint256)" - }, - "t_mapping(t_address,t_uint256)": { - "encoding": "mapping", - "key": "t_address", - "label": "mapping(address => uint256)", - "numberOfBytes": "32", - "value": "t_uint256" - }, - "t_uint256": { - "encoding": "inplace", - "label": "uint256", - "numberOfBytes": "32" - }, - "t_uint8": { - "encoding": "inplace", - "label": "uint8", - "numberOfBytes": "1" - } - } - } -} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/AccidentHandler20220715V3.json b/packages/bonds/deployments/bsctest/BondFactory.json similarity index 74% rename from packages/bonds/deployments/bsctest/AccidentHandler20220715V3.json rename to packages/bonds/deployments/bsctest/BondFactory.json index 9ab9928..e6c0c32 100644 --- a/packages/bonds/deployments/bsctest/AccidentHandler20220715V3.json +++ b/packages/bonds/deployments/bsctest/BondFactory.json @@ -1,5 +1,5 @@ { - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "abi": [ { "anonymous": false, @@ -142,6 +142,57 @@ "name": "AdminUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "bondToken", + "type": "address" + } + ], + "name": "BondCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "kind", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "previousImplementation", + "type": "address" + } + ], + "name": "BondImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "bondToken", + "type": "address" + } + ], + "name": "BondRemoved", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -159,35 +210,35 @@ "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", - "name": "user", + "name": "bondToken", "type": "address" }, { "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" + "internalType": "uint256", + "name": "price", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "amount", + "name": "previousPrice", "type": "uint256" } ], - "name": "Retrieve", + "name": "PriceUpdated", "type": "event" }, { "inputs": [], - "name": "admin", + "name": "PERCENTAGE_FACTOR", "outputs": [ { - "internalType": "address", + "internalType": "uint16", "name": "", - "type": "address" + "type": "uint16" } ], "stateMutability": "view", @@ -195,12 +246,12 @@ }, { "inputs": [], - "name": "endingAt", + "name": "admin", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -208,20 +259,40 @@ }, { "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "bondImplementations", + "outputs": [ { "internalType": "address", - "name": "admin_", + "name": "", "type": "address" - }, + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "endingAt_", + "name": "", "type": "uint256" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", + "name": "bondKinds", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", "type": "function" }, { @@ -232,7 +303,7 @@ "type": "address" } ], - "name": "remainTokenMap", + "name": "bondPrices", "outputs": [ { "internalType": "uint256", @@ -246,17 +317,17 @@ { "inputs": [ { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "retrievables", + "name": "bondSeries", "outputs": [ { - "internalType": "uint256[]", + "internalType": "string", "name": "", - "type": "uint256[]" + "type": "string" } ], "stateMutability": "view", @@ -265,30 +336,121 @@ { "inputs": [ { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" + "internalType": "string", + "name": "kind_", + "type": "string" + }, + { + "internalType": "uint256", + "name": "tradingAmount", + "type": "uint256" + } + ], + "name": "calculateFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "kind_", + "type": "string" + }, + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPrice_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "initialGrant_", + "type": "uint256" + }, + { + "internalType": "string", + "name": "series_", + "type": "string" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "underlyingToken_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maturity_", + "type": "uint256" + } + ], + "name": "createBond", + "outputs": [ + { + "internalType": "address", + "name": "bondTokenAddress", + "type": "address" } ], - "name": "retrieveTokens", - "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "getBondKinds", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBondSeries", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { - "internalType": "address[]", - "name": "tokens", - "type": "address[]" + "internalType": "string", + "name": "kind_", + "type": "string" } ], - "name": "retrieved", + "name": "getKindBondLength", "outputs": [ { - "internalType": "uint256[]", + "internalType": "uint256", "name": "", - "type": "uint256[]" + "type": "uint256" } ], "stateMutability": "view", @@ -298,24 +460,54 @@ "inputs": [ { "internalType": "address", - "name": "newAdmin", + "name": "bondToken_", "type": "address" } ], - "name": "setAdmin", - "outputs": [], - "stateMutability": "nonpayable", + "name": "getPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", "type": "function" }, { "inputs": [ + { + "internalType": "string", + "name": "series_", + "type": "string" + } + ], + "name": "getSeriesBondLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bondToken_", + "type": "address" + }, { "internalType": "uint256", - "name": "endingAt_", + "name": "amount_", "type": "uint256" } ], - "name": "setEndingAt", + "name": "grant", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -323,29 +515,12 @@ { "inputs": [ { - "components": [ - { - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "internalType": "struct AccidentHandler20220715V3.Record[]", - "name": "records_", - "type": "tuple[]" - } - ], - "name": "setRecords", + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -353,17 +528,43 @@ { "inputs": [ { - "internalType": "address", + "internalType": "string", "name": "", - "type": "address" + "type": "string" }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "kindBondsMapping", + "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], - "name": "userRetrievableTokenMap", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "priceDecimals", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "priceFactor", "outputs": [ { "internalType": "uint256", @@ -376,26 +577,111 @@ }, { "inputs": [ + { + "internalType": "contract IBond", + "name": "bondToken_", + "type": "address" + } + ], + "name": "removeBond", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "seriesBondsMapping", + "outputs": [ { "internalType": "address", "name": "", "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "kind_", + "type": "string" }, { "internalType": "address", - "name": "", + "name": "impl_", "type": "address" + }, + { + "internalType": "bool", + "name": "upgradeDeployed_", + "type": "bool" } ], - "name": "userRetrievedTokenMap", - "outputs": [ + "name": "setBondImplementation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bondToken_", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "price", "type": "uint256" } ], - "stateMutability": "view", + "name": "setPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bondToken_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "underlyingOut", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -420,95 +706,91 @@ "type": "constructor" } ], - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", "receipt": { "to": null, - "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", - "contractAddress": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", - "transactionIndex": 6, - "gasUsed": "692987", - "logsBloom": "0x00000000040000000000000000010000000000000000000000800000000000000000000800000000000400000000000000000000000004000000000000000000011000000000000000000000000000000001000000000000000200000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000020000000000080000000800000000000000000000000000000000000000600000000000000000000000000000000000008000000000008000000000000040000000000000000000000000000000020000000000000000000000400000000000000000000000000000000000000000000", - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163", - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "from": "0xe7a2b8c8fed53713f69227e6c3d2384e80cf88a6", + "contractAddress": "0x4245d080839ddad01af007c196b02ba26c842baf", + "transactionIndex": "0x0", + "gasUsed": "0xa3fd4", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800001000000000000000000000000000440000000000000000000000004000000000000000000001000000000000000000000000000000001000000000000000200000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000020000000000080000000000000000000000000000000000000000000000600000000000000000000000000000000008000000000000108000000000000040000000000000000004000000000000020000000000000000000000400000008000000000000000000000000000000000000", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", "logs": [ { - "transactionIndex": 6, - "blockNumber": 21796345, - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "topics": [ "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000001a197925bfb0fc07fb6323fd40a9a98485720c6a" + "0x000000000000000000000000c2720bc2c5a99dcca5d623df513423c3c794754b" ], "data": "0x", - "logIndex": 7, - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x0", + "removed": false }, { - "transactionIndex": 6, - "blockNumber": 21796345, - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "topics": [ "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6", "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" ], "data": "0x", - "logIndex": 8, - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x1", + "removed": false }, { - "transactionIndex": 6, - "blockNumber": 21796345, - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "topics": [ "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 9, - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x2", + "removed": false }, { - "transactionIndex": 6, - "blockNumber": 21796345, - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" ], "data": "0x", - "logIndex": 10, - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x3", + "removed": false } ], - "blockNumber": 21796345, - "cumulativeGasUsed": "970069", - "status": 1, - "byzantium": true + "blockNumber": "0x171b5b7", + "cumulativeGasUsed": "0xa3fd4", + "status": "0x1" }, "args": [ - "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", + "0xC2720Bc2C5a99DCCA5d623df513423c3C794754B", "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", - "0xcd6dc687000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a600000000000000000000000000000000000000000000000000000000634289d3" + "0xc4d66de8000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" ], - "numDeployments": 1, + "numDeployments": 4, "solcInputHash": "41a8600e180880fe88609322a6b2ac21", "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/proxy/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/proxy/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n constructor(\\n address implementationAddress,\\n address ownerAddress,\\n bytes memory data\\n ) payable {\\n _setImplementation(implementationAddress, data);\\n _setOwner(ownerAddress);\\n }\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xb9c14a66c8a4eefabca13cc8dd8133c1587909bb1124fa793c50ab46358b63e4\",\"license\":\"MIT\"},\"solc_0.8/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 {\\n revert(0, retSz)\\n }\\n default {\\n return(0, retSz)\\n }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success, ) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x68c8cf1a340a53d31de8ed808bb66d64e83d50b20d80a0b2dff6aba903cebc98\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x608060405260405162000ccc38038062000ccc8339810160408190526200002691620001fc565b62000032838262000046565b6200003d8262000128565b505050620002fa565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511562000123576000836001600160a01b031683604051620000ca9190620002dc565b600060405180830381855af49150503d806000811462000107576040519150601f19603f3d011682016040523d82523d6000602084013e6200010c565b606091505b505090508062000121573d806000803e806000fd5b505b505050565b60006200014260008051602062000cac8339815191525490565b90508160008051602062000cac83398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80516001600160a01b0381168114620001b257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001ea578181015183820152602001620001d0565b83811115620001215750506000910152565b6000806000606084860312156200021257600080fd5b6200021d846200019a565b92506200022d602085016200019a565b60408501519092506001600160401b03808211156200024b57600080fd5b818601915086601f8301126200026057600080fd5b815181811115620002755762000275620001b7565b604051601f8201601f19908116603f01168101908382118183101715620002a057620002a0620001b7565b81604052828152896020848701011115620002ba57600080fd5b620002cd836020830160208801620001cd565b80955050505050509250925092565b60008251620002f0818460208701620001cd565b9190910192915050565b6109a2806200030a6000396000f3fe60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", "deployedBytecode": "0x60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033", - "execute": { - "methodName": "initialize", - "args": [ - "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", - 1665305043 - ] - }, - "implementation": "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", + "implementation": "0x5a162c749ef599F3Da52D0f0beb026Ec1Ed99206", "devdoc": { "kind": "dev", "methods": {}, diff --git a/packages/bonds/deployments/bsctest/BondFactory_Implementation.json b/packages/bonds/deployments/bsctest/BondFactory_Implementation.json new file mode 100644 index 0000000..5f7fe07 --- /dev/null +++ b/packages/bonds/deployments/bsctest/BondFactory_Implementation.json @@ -0,0 +1,762 @@ +{ + "address": "0x5a162c749ef599F3Da52D0f0beb026Ec1Ed99206", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "bondToken", + "type": "address" + } + ], + "name": "BondCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "kind", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "implementation", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "previousImplementation", + "type": "address" + } + ], + "name": "BondImplementationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "bondToken", + "type": "address" + } + ], + "name": "BondRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bondToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "previousPrice", + "type": "uint256" + } + ], + "name": "PriceUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "PERCENTAGE_FACTOR", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "bondImplementations", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "bondKinds", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "bondPrices", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "bondSeries", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "kind_", + "type": "string" + }, + { + "internalType": "uint256", + "name": "tradingAmount", + "type": "uint256" + } + ], + "name": "calculateFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "kind_", + "type": "string" + }, + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + }, + { + "internalType": "uint256", + "name": "initialPrice_", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "initialGrant_", + "type": "uint256" + }, + { + "internalType": "string", + "name": "series_", + "type": "string" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "underlyingToken_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maturity_", + "type": "uint256" + } + ], + "name": "createBond", + "outputs": [ + { + "internalType": "address", + "name": "bondTokenAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getBondKinds", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBondSeries", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "kind_", + "type": "string" + } + ], + "name": "getKindBondLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bondToken_", + "type": "address" + } + ], + "name": "getPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "series_", + "type": "string" + } + ], + "name": "getSeriesBondLength", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bondToken_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "grant", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "kindBondsMapping", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "priceDecimals", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "priceFactor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IBond", + "name": "bondToken_", + "type": "address" + } + ], + "name": "removeBond", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "seriesBondsMapping", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "setAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "kind_", + "type": "string" + }, + { + "internalType": "address", + "name": "impl_", + "type": "address" + }, + { + "internalType": "bool", + "name": "upgradeDeployed_", + "type": "bool" + } + ], + "name": "setBondImplementation", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bondToken_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "setPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bondToken_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "underlyingOut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x6f873ec33aac45b818ff6c60915c230d2db892d9b111493caaa262ad27705ba5", + "receipt": { + "to": null, + "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "contractAddress": "0x5a162c749ef599F3Da52D0f0beb026Ec1Ed99206", + "transactionIndex": 1, + "gasUsed": "2657721", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa2b68657dd4cb20659d020212351fafcb6687c27b3d2dbbb17294d802bb9803d", + "transactionHash": "0x6f873ec33aac45b818ff6c60915c230d2db892d9b111493caaa262ad27705ba5", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 24233291, + "transactionHash": "0x6f873ec33aac45b818ff6c60915c230d2db892d9b111493caaa262ad27705ba5", + "address": "0x5a162c749ef599F3Da52D0f0beb026Ec1Ed99206", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 1, + "blockHash": "0xa2b68657dd4cb20659d020212351fafcb6687c27b3d2dbbb17294d802bb9803d" + } + ], + "blockNumber": 24233291, + "cumulativeGasUsed": "2839358", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 8, + "solcInputHash": "21f9402e2ca5f3597c1386289d997b81", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"bondToken\",\"type\":\"address\"}],\"name\":\"BondCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"kind\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"}],\"name\":\"BondImplementationUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"bondToken\",\"type\":\"address\"}],\"name\":\"BondRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bondToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousPrice\",\"type\":\"uint256\"}],\"name\":\"PriceUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"PERCENTAGE_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"bondImplementations\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"bondKinds\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"bondPrices\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"bondSeries\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"tradingAmount\",\"type\":\"uint256\"}],\"name\":\"calculateFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"initialPrice_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"initialGrant_\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"series_\",\"type\":\"string\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"underlyingToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maturity_\",\"type\":\"uint256\"}],\"name\":\"createBond\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"bondTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBondKinds\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBondSeries\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"}],\"name\":\"getKindBondLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"}],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"series_\",\"type\":\"string\"}],\"name\":\"getSeriesBondLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"grant\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kindBondsMapping\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"priceDecimals\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"priceFactor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IBond\",\"name\":\"bondToken_\",\"type\":\"address\"}],\"name\":\"removeBond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"seriesBondsMapping\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"impl_\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"upgradeDeployed_\",\"type\":\"bool\"}],\"name\":\"setBondImplementation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"setPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"underlyingOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"PERCENTAGE_FACTOR\":{\"details\":\"factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%; Calculation formula: x * percentage / PERCENTAGE_FACTOR\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/BondFactory.sol\":\"BondFactory\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC1967/ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\\n * clashing], which can potentially be used in an attack, this contract uses the\\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\\n * things that go hand in hand:\\n *\\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\\n * that call matches one of the admin functions exposed by the proxy itself.\\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\\n * \\\"admin cannot fallback to proxy target\\\".\\n *\\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\\n * to sudden errors when trying to call a function from the proxy implementation.\\n *\\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n /**\\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\\n */\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable ERC1967Proxy(_logic, _data) {\\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1));\\n _changeAdmin(admin_);\\n }\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function admin() external ifAdmin returns (address admin_) {\\n admin_ = _getAdmin();\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function implementation() external ifAdmin returns (address implementation_) {\\n implementation_ = _implementation();\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\\n */\\n function changeAdmin(address newAdmin) external virtual ifAdmin {\\n _changeAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\\n */\\n function upgradeTo(address newImplementation) external ifAdmin {\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\\n */\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\\n _upgradeToAndCall(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\\n */\\n function _beforeFallback() internal virtual override {\\n require(msg.sender != _getAdmin(), \\\"TransparentUpgradeableProxy: admin cannot fallback to proxy target\\\");\\n super._beforeFallback();\\n }\\n}\\n\",\"keccak256\":\"0x140055a64cf579d622e04f5a198595832bf2cb193cd0005f4f2d4d61ca906253\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2ccf9d2313a313d41a791505f2b5abfdc62191b5d4334f7f7a82691c088a1c87\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"},\"contracts/BondFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n\\nimport \\\"./interfaces/IBondFactory.sol\\\";\\nimport \\\"./interfaces/IBond.sol\\\";\\nimport \\\"./libs/Adminable.sol\\\";\\nimport \\\"./libs/DuetTransparentUpgradeableProxy.sol\\\";\\n\\ncontract BondFactory is IBondFactory, Initializable, Adminable {\\n /**\\n * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%;\\n * Calculation formula: x * percentage / PERCENTAGE_FACTOR\\n */\\n uint16 public constant PERCENTAGE_FACTOR = 10000;\\n // kind => impl\\n mapping(string => address) public bondImplementations;\\n // kind => bond addresses\\n mapping(string => address[]) public kindBondsMapping;\\n // series => bond addresses\\n mapping(string => address[]) public seriesBondsMapping;\\n string[] public bondKinds;\\n string[] public bondSeries;\\n\\n // bond => price\\n mapping(address => uint256) public bondPrices;\\n\\n event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice);\\n event BondImplementationUpdated(string kind, address implementation, address previousImplementation);\\n event BondCreated(address bondToken);\\n event BondRemoved(address bondToken);\\n\\n constructor() initializer {}\\n\\n function initialize(address admin_) public initializer {\\n _setAdmin(admin_);\\n }\\n\\n function createBond(\\n string memory kind_,\\n string memory name_,\\n string memory symbol_,\\n uint256 initialPrice_,\\n uint256 initialGrant_,\\n string memory series_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_\\n ) external onlyAdmin returns (address bondTokenAddress) {\\n address proxyAdmin = address(this);\\n address bondImpl = bondImplementations[kind_];\\n require(bondImpl != address(0), \\\"BondFactory: Invalid bond implementation\\\");\\n require(initialPrice_ > 0, \\\"BondFactory: INVALID_PRICE\\\");\\n bytes memory proxyData;\\n DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData);\\n bondTokenAddress = address(proxy);\\n IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_);\\n if (seriesBondsMapping[series_].length == 0) {\\n bondSeries.push(series_);\\n }\\n setPrice(bondTokenAddress, initialPrice_);\\n if (initialGrant_ > 0) {\\n grant(bondTokenAddress, initialGrant_);\\n }\\n seriesBondsMapping[series_].push(bondTokenAddress);\\n kindBondsMapping[kind_].push(bondTokenAddress);\\n emit BondCreated(bondTokenAddress);\\n }\\n\\n function getBondKinds() external view returns (string[] memory) {\\n return bondKinds;\\n }\\n\\n function getKindBondLength(string memory kind_) external view returns (uint256) {\\n return kindBondsMapping[kind_].length;\\n }\\n\\n function getBondSeries() external view returns (string[] memory) {\\n return bondSeries;\\n }\\n\\n function getSeriesBondLength(string memory series_) external view returns (uint256) {\\n return seriesBondsMapping[series_].length;\\n }\\n\\n function setBondImplementation(\\n string calldata kind_,\\n address impl_,\\n bool upgradeDeployed_\\n ) external onlyAdmin {\\n if (bondImplementations[kind_] == address(0)) {\\n bondKinds.push(kind_);\\n }\\n emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]);\\n bondImplementations[kind_] = impl_;\\n if (!upgradeDeployed_) {\\n return;\\n }\\n for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) {\\n DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_);\\n }\\n }\\n\\n function setPrice(address bondToken_, uint256 price) public onlyAdmin {\\n emit PriceUpdated(bondToken_, price, bondPrices[bondToken_]);\\n bondPrices[bondToken_] = price;\\n }\\n\\n function getPrice(address bondToken_) public view returns (uint256) {\\n return bondPrices[bondToken_];\\n }\\n\\n function priceDecimals() public view returns (uint256) {\\n return 8;\\n }\\n\\n function priceFactor() public view returns (uint256) {\\n return 10**priceDecimals();\\n }\\n\\n function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin {\\n IBond(bondToken_).underlyingOut(amount_, msg.sender);\\n }\\n\\n function grant(address bondToken_, uint256 amount_) public onlyAdmin {\\n IBond(bondToken_).grant(amount_);\\n }\\n\\n function removeBond(IBond bondToken_) external onlyAdmin {\\n require(bondToken_.totalSupply() <= 0, \\\"BondFactory: CANT_REMOVE\\\");\\n string memory kind = bondToken_.kind();\\n string memory series = bondToken_.series();\\n address bondTokenAddress = address(bondToken_);\\n\\n uint256 kindBondLength = kindBondsMapping[kind].length;\\n for (uint256 i = 0; i < kindBondLength; i++) {\\n if (kindBondsMapping[kind][i] != bondTokenAddress) {\\n continue;\\n }\\n kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1];\\n kindBondsMapping[kind].pop();\\n }\\n\\n uint256 seriesBondLength = seriesBondsMapping[series].length;\\n for (uint256 j = 0; j < seriesBondLength; j++) {\\n if (seriesBondsMapping[series][j] != bondTokenAddress) {\\n continue;\\n }\\n seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1];\\n seriesBondsMapping[series].pop();\\n }\\n\\n emit BondRemoved(bondTokenAddress);\\n }\\n\\n function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) {\\n // TODO\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xb3da317ea41aa150d47492627b0959df7a26db1871ab4291a7eeeb84135a7280\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBond.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface IBond is IERC20Upgradeable {\\n function initialize(\\n string memory name_,\\n string memory symbol_,\\n string memory series,\\n address factory_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_\\n ) external;\\n\\n function kind() external returns (string memory);\\n\\n function series() external returns (string memory);\\n\\n function underlyingOut(uint256 amount_, address to_) external;\\n\\n function grant(uint256 amount_) external;\\n\\n function faceValue(uint256 bondAmount_) external view returns (uint256);\\n\\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x2e6653c949a3ae433a1e7ed6c7fd37b3886cd073be18d9c5e9402358cf36e8ff\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBondFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\ninterface IBondFactory {\\n function priceFactor() external view returns (uint256);\\n\\n function getPrice(address bondToken_) external view returns (uint256 price);\\n}\\n\",\"keccak256\":\"0x43ebf47455cddb545064cb42203f7973492dbf15c1e7204d5c0fefbd8aea8e23\",\"license\":\"GPL-3.0\"},\"contracts/libs/Adminable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nabstract contract Adminable {\\n event AdminUpdated(address indexed user, address indexed newAdmin);\\n\\n address public admin;\\n\\n modifier onlyAdmin() virtual {\\n require(msg.sender == admin, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n function setAdmin(address newAdmin) public virtual onlyAdmin {\\n _setAdmin(newAdmin);\\n }\\n\\n function _setAdmin(address newAdmin) internal {\\n require(newAdmin != address(0), \\\"Can not set admin to zero address\\\");\\n admin = newAdmin;\\n\\n emit AdminUpdated(msg.sender, newAdmin);\\n }\\n}\\n\",\"keccak256\":\"0xe47c97c0e3edad2d1df3e664376a7bb46e1aaf51b4c4acc73c4a2cfdc747185f\",\"license\":\"GPL-3.0\"},\"contracts/libs/DuetTransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\nimport \\\"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\\\";\\n\\ncontract DuetTransparentUpgradeableProxy is TransparentUpgradeableProxy {\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {}\\n\\n /**\\n * @dev override parent behavior to manage bonds fully in Factory\\n *\\n */\\n function _beforeFallback() internal virtual override {}\\n}\\n\",\"keccak256\":\"0xe59f85b113777531c6519e0cd2bedbc35844ca809a153b10a9f17840042978b1\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50600062000020600162000087565b9050801562000039576000805461ff0019166101001790555b801562000080576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50620001a8565b60008054610100900460ff161562000120578160ff166001148015620000c05750620000be306200019960201b620014f01760201c565b155b620001185760405162461bcd60e51b815260206004820152602e60248201526000805160206200305d83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff8084169116106200017f5760405162461bcd60e51b815260206004820152602e60248201526000805160206200305d83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016200010f565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b612ea580620001b86000396000f3fe60806040523480156200001157600080fd5b5060043610620001745760003560e01c80637c33d3d811620000d3578063ef0cef6c1162000086578063ef0cef6c1462000350578063efc51bca1462000367578063f21c5563146200039e578063f851a44014620003b5578063f920ea5414620003cf578063fd5b909214620003e657600080fd5b80637c33d3d814620002cd578063b67afd8814620002e4578063c4d66de81462000307578063dfb2866d146200031e578063e988b66f1462000328578063ee01e5e7146200033257600080fd5b806341976e09116200012c57806341976e09146200021d5780636016338b14620002495780636141380214620002625780636370920e1462000288578063704b6c02146200029f57806373f7e98a14620002b657600080fd5b8062e4768b146200017957806305300b2814620001925780630f988f7014620001a857806326eb508514620001bf57806334b4fc7614620001ef578063381bac331462000206575b600080fd5b620001906200018a36600462001792565b620003fd565b005b60085b6040519081526020015b60405180910390f35b62000190620001b936600462001792565b620004a6565b620001d6620001d036600462001892565b62000540565b6040516001600160a01b0390911681526020016200019f565b620001d662000200366004620018e8565b62000588565b6200019562000217366004620019d2565b620008bb565b620001956200022e36600462001a13565b6001600160a01b031660009081526006602052604090205490565b62000253620008e5565b6040516200019f919062001a97565b620002796200027336600462001afd565b620009c8565b6040516200019f919062001b17565b620001906200029936600462001792565b62000a7d565b62000190620002b036600462001a13565b62000ade565b62000195620002c736600462001892565b62000b1f565b620001d6620002de36600462001892565b62000b28565b62000195620002f536600462001a13565b60066020526000908152604090205481565b620001906200031836600462001a13565b62000b54565b6200019562000bd1565b6200025362000be6565b6200033c61271081565b60405161ffff90911681526020016200019f565b620002796200036136600462001afd565b62000cc0565b620001d662000378366004620019d2565b80516020818301810180516001825292820191909301209152546001600160a01b031681565b62000195620003af366004620019d2565b62000cd1565b600054620001d6906201000090046001600160a01b031681565b62000190620003e036600462001b2c565b62000ce5565b62000190620003f736600462001a13565b62000f3f565b6000546201000090046001600160a01b03163314620004395760405162461bcd60e51b8152600401620004309062001bcd565b60405180910390fd5b6001600160a01b038216600081815260066020908152604091829020548251858152918201527fb556fac599c3c70efb9ab1fa725ecace6c81cc48d1455f886607def065f3e0c0910160405180910390a26001600160a01b03909116600090815260066020526040902055565b6000546201000090046001600160a01b03163314620004d95760405162461bcd60e51b8152600401620004309062001bcd565b604051633f78aea360e21b8152600481018290523360248201526001600160a01b0383169063fde2ba8c906044015b600060405180830381600087803b1580156200052357600080fd5b505af115801562000538573d6000803e3d6000fd5b505050505050565b815160208184018101805160038252928201918501919091209190528054829081106200056c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080546201000090046001600160a01b03163314620005bc5760405162461bcd60e51b8152600401620004309062001bcd565b6000309050600060018b604051620005d5919062001bf3565b908152604051908190036020019020546001600160a01b0316905080620006505760405162461bcd60e51b815260206004820152602860248201527f426f6e64466163746f72793a20496e76616c696420626f6e6420696d706c656d60448201526732b73a30ba34b7b760c11b606482015260840162000430565b60008811620006a25760405162461bcd60e51b815260206004820152601a60248201527f426f6e64466163746f72793a20494e56414c49445f5052494345000000000000604482015260640162000430565b60606000828483604051620006b7906200164b565b620006c59392919062001c11565b604051809103906000f080158015620006e2573d6000803e3d6000fd5b50604051634b71ae7560e11b81529095508591506001600160a01b038216906396e35cea9062000721908f908f908d9030908e908e9060040162001c48565b600060405180830381600087803b1580156200073c57600080fd5b505af115801562000751573d6000803e3d6000fd5b5050505060038860405162000767919062001bf3565b90815260405190819003602001902054620007c357600580546001810182556000919091528851620007c1917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208b019062001659565b505b620007cf858b620003fd565b8815620007e257620007e2858a62000a7d565b600388604051620007f4919062001bf3565b908152604051602091819003820181208054600181018255600091825292902090910180546001600160a01b0319166001600160a01b03881617905560029062000840908f9062001bf3565b9081526040516020918190038201812080546001810182556000918252908390200180546001600160a01b0319166001600160a01b03891690811790915581527f607dd1c5b5447c9bd5a6d83ea5b7aeeb40f4090e1363840bd8cf024eb33f86e2910160405180910390a15050505098975050505050505050565b6000600282604051620008cf919062001bf3565b9081526040519081900360200190205492915050565b60606004805480602002602001604051908101604052809291908181526020016000905b82821015620009bf5783829060005260206000200180546200092b9062001cad565b80601f0160208091040260200160405190810160405280929190818152602001828054620009599062001cad565b8015620009aa5780601f106200097e57610100808354040283529160200191620009aa565b820191906000526020600020905b8154815290600101906020018083116200098c57829003601f168201915b50505050508152602001906001019062000909565b50505050905090565b60058181548110620009d957600080fd5b906000526020600020016000915090508054620009f69062001cad565b80601f016020809104026020016040519081016040528092919081815260200182805462000a249062001cad565b801562000a755780601f1062000a495761010080835404028352916020019162000a75565b820191906000526020600020905b81548152906001019060200180831162000a5757829003601f168201915b505050505081565b6000546201000090046001600160a01b0316331462000ab05760405162461bcd60e51b8152600401620004309062001bcd565b60405163160e3f3d60e01b8152600481018290526001600160a01b0383169063160e3f3d9060240162000508565b6000546201000090046001600160a01b0316331462000b115760405162461bcd60e51b8152600401620004309062001bcd565b62000b1c81620014ff565b50565b60005b92915050565b815160208184018101805160028252928201918501919091209190528054829081106200056c57600080fd5b600062000b626001620015b6565b9050801562000b7b576000805461ff0019166101001790555b62000b8682620014ff565b801562000bcd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600062000be16008600a62001dfd565b905090565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015620009bf57838290600052602060002001805462000c2c9062001cad565b80601f016020809104026020016040519081016040528092919081815260200182805462000c5a9062001cad565b801562000cab5780601f1062000c7f5761010080835404028352916020019162000cab565b820191906000526020600020905b81548152906001019060200180831162000c8d57829003601f168201915b50505050508152602001906001019062000c0a565b60048181548110620009d957600080fd5b6000600382604051620008cf919062001bf3565b6000546201000090046001600160a01b0316331462000d185760405162461bcd60e51b8152600401620004309062001bcd565b60006001600160a01b03166001858560405162000d3792919062001e0b565b908152604051908190036020019020546001600160a01b0316141562000d98576004805460018101825560009190915262000d96907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018585620016e8565b505b7fe562b1204ef3c8cf86ddccbb5b4fe6ca6cea7d4c1721e54d179f2b76720be1668484846001888860405162000dd092919062001e0b565b9081526040519081900360200181205462000dfa949392916001600160a01b039091169062001e1b565b60405180910390a1816001858560405162000e1792919062001e0b565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790558062000e525762000f39565b60005b6002858560405162000e6992919062001e0b565b9081526040519081900360200190205481101562000f37576002858560405162000e9592919062001e0b565b9081526020016040518091039020818154811062000eb75762000eb762001e62565b600091825260209091200154604051631b2ce7f360e11b81526001600160a01b03858116600483015290911690633659cfe690602401600060405180830381600087803b15801562000f0857600080fd5b505af115801562000f1d573d6000803e3d6000fd5b50505050808062000f2e9062001e78565b91505062000e55565b505b50505050565b6000546201000090046001600160a01b0316331462000f725760405162461bcd60e51b8152600401620004309062001bcd565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000fae57600080fd5b505afa15801562000fc3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fe9919062001e96565b1115620010395760405162461bcd60e51b815260206004820152601860248201527f426f6e64466163746f72793a2043414e545f52454d4f56450000000000000000604482015260640162000430565b6000816001600160a01b03166304baa00b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200107757600080fd5b505af11580156200108c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620010b6919081019062001eb0565b90506000826001600160a01b031663f12d870f6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620010f657600080fd5b505af11580156200110b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001135919081019062001eb0565b90506000839050600060028460405162001150919062001bf3565b90815260405190819003602001902054905060005b81811015620012f357826001600160a01b03166002866040516200118a919062001bf3565b90815260200160405180910390208281548110620011ac57620011ac62001e62565b6000918252602090912001546001600160a01b031614620011cd57620012de565b600285604051620011df919062001bf3565b908152604051908190036020019020620011fb60018462001f27565b815481106200120e576200120e62001e62565b6000918252602090912001546040516001600160a01b03909116906002906200123990889062001bf3565b908152602001604051809103902082815481106200125b576200125b62001e62565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002856040516200129b919062001bf3565b9081526020016040518091039020805480620012bb57620012bb62001f41565b600082815260209020810160001990810180546001600160a01b03191690550190555b80620012ea8162001e78565b91505062001165565b50600060038460405162001308919062001bf3565b90815260405190819003602001902054905060005b81811015620014ab57836001600160a01b031660038660405162001342919062001bf3565b9081526020016040518091039020828154811062001364576200136462001e62565b6000918252602090912001546001600160a01b031614620013855762001496565b60038560405162001397919062001bf3565b908152604051908190036020019020620013b360018462001f27565b81548110620013c657620013c662001e62565b6000918252602090912001546040516001600160a01b0390911690600390620013f190889062001bf3565b9081526020016040518091039020828154811062001413576200141362001e62565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060038560405162001453919062001bf3565b908152602001604051809103902080548062001473576200147362001f41565b600082815260209020810160001990810180546001600160a01b03191690550190555b80620014a28162001e78565b9150506200131d565b506040516001600160a01b03841681527fff88a3b6ae790816ff4f385e4c1acba5a2f5abd3972c4a3c99aa212d8a46f6c39060200160405180910390a1505050505050565b6001600160a01b03163b151590565b6001600160a01b038116620015615760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b606482015260840162000430565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff161562001602578160ff166001148015620015db5750303b155b620015fa5760405162461bcd60e51b8152600401620004309062001f57565b506000919050565b60005460ff8084169116106200162c5760405162461bcd60e51b8152600401620004309062001f57565b506000805460ff191660ff92909216919091179055600190565b919050565b610eca8062001fa683390190565b828054620016679062001cad565b90600052602060002090601f0160209004810192826200168b5760008555620016d6565b82601f10620016a657805160ff1916838001178555620016d6565b82800160010185558215620016d6579182015b82811115620016d6578251825591602001919060010190620016b9565b50620016e492915062001765565b5090565b828054620016f69062001cad565b90600052602060002090601f0160209004810192826200171a5760008555620016d6565b82601f10620017355782800160ff19823516178555620016d6565b82800160010185558215620016d6579182015b82811115620016d657823582559160200191906001019062001748565b5b80821115620016e4576000815560010162001766565b6001600160a01b038116811462000b1c57600080fd5b60008060408385031215620017a657600080fd5b8235620017b3816200177c565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715620018035762001803620017c1565b604052919050565b600067ffffffffffffffff821115620018285762001828620017c1565b50601f01601f191660200190565b600082601f8301126200184857600080fd5b81356200185f62001859826200180b565b620017d7565b8181528460208386010111156200187557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215620018a657600080fd5b823567ffffffffffffffff811115620018be57600080fd5b620018cc8582860162001836565b95602094909401359450505050565b803562001646816200177c565b600080600080600080600080610100898b0312156200190657600080fd5b883567ffffffffffffffff808211156200191f57600080fd5b6200192d8c838d0162001836565b995060208b01359150808211156200194457600080fd5b620019528c838d0162001836565b985060408b01359150808211156200196957600080fd5b620019778c838d0162001836565b975060608b0135965060808b0135955060a08b01359150808211156200199c57600080fd5b50620019ab8b828c0162001836565b935050620019bc60c08a01620018db565b915060e089013590509295985092959890939650565b600060208284031215620019e557600080fd5b813567ffffffffffffffff811115620019fd57600080fd5b62001a0b8482850162001836565b949350505050565b60006020828403121562001a2657600080fd5b813562001a33816200177c565b9392505050565b60005b8381101562001a5757818101518382015260200162001a3d565b8381111562000f395750506000910152565b6000815180845262001a8381602086016020860162001a3a565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101562001af057603f1988860301845262001add85835162001a69565b9450928501929085019060010162001abe565b5092979650505050505050565b60006020828403121562001b1057600080fd5b5035919050565b60208152600062001a33602083018462001a69565b6000806000806060858703121562001b4357600080fd5b843567ffffffffffffffff8082111562001b5c57600080fd5b818701915087601f83011262001b7157600080fd5b81358181111562001b8157600080fd5b88602082850101111562001b9457600080fd5b6020928301965094505085013562001bac816200177c565b91506040850135801515811462001bc257600080fd5b939692955090935050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6000825162001c0781846020870162001a3a565b9190910192915050565b6001600160a01b0384811682528316602082015260606040820181905260009062001c3f9083018462001a69565b95945050505050565b60c08152600062001c5d60c083018962001a69565b828103602084015262001c71818962001a69565b9050828103604084015262001c87818862001a69565b6001600160a01b0396871660608501529490951660808301525060a00152949350505050565b600181811c9082168062001cc257607f821691505b6020821081141562001ce457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562001d4157816000190482111562001d255762001d2562001cea565b8085161562001d3357918102915b93841c939080029062001d05565b509250929050565b60008262001d5a5750600162000b22565b8162001d695750600062000b22565b816001811462001d82576002811462001d8d5762001dad565b600191505062000b22565b60ff84111562001da15762001da162001cea565b50506001821b62000b22565b5060208310610133831016604e8410600b841016171562001dd2575081810a62000b22565b62001dde838362001d00565b806000190482111562001df55762001df562001cea565b029392505050565b600062001a33838362001d49565b8183823760009101908152919050565b6060815283606082015283856080830137600060808583018101919091526001600160a01b039384166020830152919092166040830152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b600060001982141562001e8f5762001e8f62001cea565b5060010190565b60006020828403121562001ea957600080fd5b5051919050565b60006020828403121562001ec357600080fd5b815167ffffffffffffffff81111562001edb57600080fd5b8201601f8101841362001eed57600080fd5b805162001efe62001859826200180b565b81815285602083850101111562001f1457600080fd5b62001c3f82602083016020860162001a3a565b60008282101562001f3c5762001f3c62001cea565b500390565b634e487b7160e01b600052603160045260246000fd5b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b60608201526080019056fe608060405260405162000eca38038062000eca83398101604081905262000026916200051f565b82828282816200005860017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd620005ff565b60008051602062000e838339815191521462000078576200007862000625565b6200008682826000620000ed565b50620000b6905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005ff565b60008051602062000e6383398151915214620000d657620000d662000625565b620000e1826200012a565b5050505050506200068e565b620000f88362000185565b600082511180620001065750805b156200012557620001238383620001c760201b620002581760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000155620001f6565b604080516001600160a01b03928316815291841660208301520160405180910390a162000182816200022f565b50565b6200019081620002e4565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060620001ef838360405180606001604052806027815260200162000ea36027913962000387565b9392505050565b60006200022060008051602062000e6383398151915260001b6200046d60201b620002001760201c565b546001600160a01b0316919050565b6001600160a01b0381166200029a5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002c360008051602062000e6383398151915260001b6200046d60201b620002001760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002fa816200047060201b620002841760201c565b6200035e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000291565b80620002c360008051602062000e8383398151915260001b6200046d60201b620002001760201c565b60606001600160a01b0384163b620003f15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840162000291565b600080856001600160a01b0316856040516200040e91906200063b565b600060405180830381855af49150503d80600081146200044b576040519150601f19603f3d011682016040523d82523d6000602084013e62000450565b606091505b509092509050620004638282866200047f565b9695505050505050565b90565b6001600160a01b03163b151590565b6060831562000490575081620001ef565b825115620004a15782518084602001fd5b8160405162461bcd60e51b815260040162000291919062000659565b80516001600160a01b0381168114620004d557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200050d578181015183820152602001620004f3565b83811115620001235750506000910152565b6000806000606084860312156200053557600080fd5b6200054084620004bd565b92506200055060208501620004bd565b60408501519092506001600160401b03808211156200056e57600080fd5b818601915086601f8301126200058357600080fd5b815181811115620005985762000598620004da565b604051601f8201601f19908116603f01168101908382118183101715620005c357620005c3620004da565b81604052828152896020848701011115620005dd57600080fd5b620005f0836020830160208801620004f0565b80955050505050509250925092565b6000828210156200062057634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b600082516200064f818460208701620004f0565b9190910192915050565b60208152600082518060208401526200067a816040850160208701620004f0565b601f01601f19169190910160400192915050565b6107c5806200069e6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b61008036600461064f565b610110565b61005b61009336600461066a565b610157565b3480156100a457600080fd5b506100ad6101c8565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e436600461064f565b610203565b3480156100f557600080fd5b506100ad61022d565b61010e610109610293565b61029d565b565b6101186102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c816040518060200160405280600081525060006102f4565b50565b61014c6100fe565b61015f6102c1565b6001600160a01b0316336001600160a01b031614156101c0576101bb8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506102f4915050565b505050565b6101bb6100fe565b60006101d26102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f3610293565b905090565b6102006100fe565b90565b61020b6102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c8161031f565b60006102376102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f36102c1565b606061027d838360405180606001604052806027815260200161076960279139610373565b9392505050565b6001600160a01b03163b151590565b60006101f3610455565b3660008037600080366000845af43d6000803e8080156102bc573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6102fd8361047d565b60008251118061030a5750805b156101bb576103198383610258565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103486102c1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014c816104bd565b60606001600160a01b0384163b6103e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516103fb9190610719565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044b828286610566565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102e5565b6104868161059f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105225760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d7565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561057557508161027d565b8251156105855782518084602001fd5b8160405162461bcd60e51b81526004016103d79190610735565b6001600160a01b0381163b61060c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016103d7565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610545565b80356001600160a01b038116811461064a57600080fd5b919050565b60006020828403121561066157600080fd5b61027d82610633565b60008060006040848603121561067f57600080fd5b61068884610633565b9250602084013567ffffffffffffffff808211156106a557600080fd5b818601915086601f8301126106b957600080fd5b8135818111156106c857600080fd5b8760208285010111156106da57600080fd5b6020830194508093505050509250925092565b60005b838110156107085781810151838201526020016106f0565b838111156103195750506000910152565b6000825161072b8184602087016106ed565b9190910192915050565b60208152600082518060208401526107548160408501602087016106ed565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9e1fbe41895f8bf7249337aca83abf16214aebbd0a1f744a3df3f57c9c8a4e264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122094cbffb2a4f5a069670414b01778a4573e5b7bf4c495938c3b992ce65a34cae564736f6c63430008090033496e697469616c697a61626c653a20636f6e747261637420697320616c726561", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620001745760003560e01c80637c33d3d811620000d3578063ef0cef6c1162000086578063ef0cef6c1462000350578063efc51bca1462000367578063f21c5563146200039e578063f851a44014620003b5578063f920ea5414620003cf578063fd5b909214620003e657600080fd5b80637c33d3d814620002cd578063b67afd8814620002e4578063c4d66de81462000307578063dfb2866d146200031e578063e988b66f1462000328578063ee01e5e7146200033257600080fd5b806341976e09116200012c57806341976e09146200021d5780636016338b14620002495780636141380214620002625780636370920e1462000288578063704b6c02146200029f57806373f7e98a14620002b657600080fd5b8062e4768b146200017957806305300b2814620001925780630f988f7014620001a857806326eb508514620001bf57806334b4fc7614620001ef578063381bac331462000206575b600080fd5b620001906200018a36600462001792565b620003fd565b005b60085b6040519081526020015b60405180910390f35b62000190620001b936600462001792565b620004a6565b620001d6620001d036600462001892565b62000540565b6040516001600160a01b0390911681526020016200019f565b620001d662000200366004620018e8565b62000588565b6200019562000217366004620019d2565b620008bb565b620001956200022e36600462001a13565b6001600160a01b031660009081526006602052604090205490565b62000253620008e5565b6040516200019f919062001a97565b620002796200027336600462001afd565b620009c8565b6040516200019f919062001b17565b620001906200029936600462001792565b62000a7d565b62000190620002b036600462001a13565b62000ade565b62000195620002c736600462001892565b62000b1f565b620001d6620002de36600462001892565b62000b28565b62000195620002f536600462001a13565b60066020526000908152604090205481565b620001906200031836600462001a13565b62000b54565b6200019562000bd1565b6200025362000be6565b6200033c61271081565b60405161ffff90911681526020016200019f565b620002796200036136600462001afd565b62000cc0565b620001d662000378366004620019d2565b80516020818301810180516001825292820191909301209152546001600160a01b031681565b62000195620003af366004620019d2565b62000cd1565b600054620001d6906201000090046001600160a01b031681565b62000190620003e036600462001b2c565b62000ce5565b62000190620003f736600462001a13565b62000f3f565b6000546201000090046001600160a01b03163314620004395760405162461bcd60e51b8152600401620004309062001bcd565b60405180910390fd5b6001600160a01b038216600081815260066020908152604091829020548251858152918201527fb556fac599c3c70efb9ab1fa725ecace6c81cc48d1455f886607def065f3e0c0910160405180910390a26001600160a01b03909116600090815260066020526040902055565b6000546201000090046001600160a01b03163314620004d95760405162461bcd60e51b8152600401620004309062001bcd565b604051633f78aea360e21b8152600481018290523360248201526001600160a01b0383169063fde2ba8c906044015b600060405180830381600087803b1580156200052357600080fd5b505af115801562000538573d6000803e3d6000fd5b505050505050565b815160208184018101805160038252928201918501919091209190528054829081106200056c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080546201000090046001600160a01b03163314620005bc5760405162461bcd60e51b8152600401620004309062001bcd565b6000309050600060018b604051620005d5919062001bf3565b908152604051908190036020019020546001600160a01b0316905080620006505760405162461bcd60e51b815260206004820152602860248201527f426f6e64466163746f72793a20496e76616c696420626f6e6420696d706c656d60448201526732b73a30ba34b7b760c11b606482015260840162000430565b60008811620006a25760405162461bcd60e51b815260206004820152601a60248201527f426f6e64466163746f72793a20494e56414c49445f5052494345000000000000604482015260640162000430565b60606000828483604051620006b7906200164b565b620006c59392919062001c11565b604051809103906000f080158015620006e2573d6000803e3d6000fd5b50604051634b71ae7560e11b81529095508591506001600160a01b038216906396e35cea9062000721908f908f908d9030908e908e9060040162001c48565b600060405180830381600087803b1580156200073c57600080fd5b505af115801562000751573d6000803e3d6000fd5b5050505060038860405162000767919062001bf3565b90815260405190819003602001902054620007c357600580546001810182556000919091528851620007c1917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208b019062001659565b505b620007cf858b620003fd565b8815620007e257620007e2858a62000a7d565b600388604051620007f4919062001bf3565b908152604051602091819003820181208054600181018255600091825292902090910180546001600160a01b0319166001600160a01b03881617905560029062000840908f9062001bf3565b9081526040516020918190038201812080546001810182556000918252908390200180546001600160a01b0319166001600160a01b03891690811790915581527f607dd1c5b5447c9bd5a6d83ea5b7aeeb40f4090e1363840bd8cf024eb33f86e2910160405180910390a15050505098975050505050505050565b6000600282604051620008cf919062001bf3565b9081526040519081900360200190205492915050565b60606004805480602002602001604051908101604052809291908181526020016000905b82821015620009bf5783829060005260206000200180546200092b9062001cad565b80601f0160208091040260200160405190810160405280929190818152602001828054620009599062001cad565b8015620009aa5780601f106200097e57610100808354040283529160200191620009aa565b820191906000526020600020905b8154815290600101906020018083116200098c57829003601f168201915b50505050508152602001906001019062000909565b50505050905090565b60058181548110620009d957600080fd5b906000526020600020016000915090508054620009f69062001cad565b80601f016020809104026020016040519081016040528092919081815260200182805462000a249062001cad565b801562000a755780601f1062000a495761010080835404028352916020019162000a75565b820191906000526020600020905b81548152906001019060200180831162000a5757829003601f168201915b505050505081565b6000546201000090046001600160a01b0316331462000ab05760405162461bcd60e51b8152600401620004309062001bcd565b60405163160e3f3d60e01b8152600481018290526001600160a01b0383169063160e3f3d9060240162000508565b6000546201000090046001600160a01b0316331462000b115760405162461bcd60e51b8152600401620004309062001bcd565b62000b1c81620014ff565b50565b60005b92915050565b815160208184018101805160028252928201918501919091209190528054829081106200056c57600080fd5b600062000b626001620015b6565b9050801562000b7b576000805461ff0019166101001790555b62000b8682620014ff565b801562000bcd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600062000be16008600a62001dfd565b905090565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015620009bf57838290600052602060002001805462000c2c9062001cad565b80601f016020809104026020016040519081016040528092919081815260200182805462000c5a9062001cad565b801562000cab5780601f1062000c7f5761010080835404028352916020019162000cab565b820191906000526020600020905b81548152906001019060200180831162000c8d57829003601f168201915b50505050508152602001906001019062000c0a565b60048181548110620009d957600080fd5b6000600382604051620008cf919062001bf3565b6000546201000090046001600160a01b0316331462000d185760405162461bcd60e51b8152600401620004309062001bcd565b60006001600160a01b03166001858560405162000d3792919062001e0b565b908152604051908190036020019020546001600160a01b0316141562000d98576004805460018101825560009190915262000d96907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018585620016e8565b505b7fe562b1204ef3c8cf86ddccbb5b4fe6ca6cea7d4c1721e54d179f2b76720be1668484846001888860405162000dd092919062001e0b565b9081526040519081900360200181205462000dfa949392916001600160a01b039091169062001e1b565b60405180910390a1816001858560405162000e1792919062001e0b565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790558062000e525762000f39565b60005b6002858560405162000e6992919062001e0b565b9081526040519081900360200190205481101562000f37576002858560405162000e9592919062001e0b565b9081526020016040518091039020818154811062000eb75762000eb762001e62565b600091825260209091200154604051631b2ce7f360e11b81526001600160a01b03858116600483015290911690633659cfe690602401600060405180830381600087803b15801562000f0857600080fd5b505af115801562000f1d573d6000803e3d6000fd5b50505050808062000f2e9062001e78565b91505062000e55565b505b50505050565b6000546201000090046001600160a01b0316331462000f725760405162461bcd60e51b8152600401620004309062001bcd565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000fae57600080fd5b505afa15801562000fc3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fe9919062001e96565b1115620010395760405162461bcd60e51b815260206004820152601860248201527f426f6e64466163746f72793a2043414e545f52454d4f56450000000000000000604482015260640162000430565b6000816001600160a01b03166304baa00b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200107757600080fd5b505af11580156200108c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620010b6919081019062001eb0565b90506000826001600160a01b031663f12d870f6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620010f657600080fd5b505af11580156200110b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001135919081019062001eb0565b90506000839050600060028460405162001150919062001bf3565b90815260405190819003602001902054905060005b81811015620012f357826001600160a01b03166002866040516200118a919062001bf3565b90815260200160405180910390208281548110620011ac57620011ac62001e62565b6000918252602090912001546001600160a01b031614620011cd57620012de565b600285604051620011df919062001bf3565b908152604051908190036020019020620011fb60018462001f27565b815481106200120e576200120e62001e62565b6000918252602090912001546040516001600160a01b03909116906002906200123990889062001bf3565b908152602001604051809103902082815481106200125b576200125b62001e62565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002856040516200129b919062001bf3565b9081526020016040518091039020805480620012bb57620012bb62001f41565b600082815260209020810160001990810180546001600160a01b03191690550190555b80620012ea8162001e78565b91505062001165565b50600060038460405162001308919062001bf3565b90815260405190819003602001902054905060005b81811015620014ab57836001600160a01b031660038660405162001342919062001bf3565b9081526020016040518091039020828154811062001364576200136462001e62565b6000918252602090912001546001600160a01b031614620013855762001496565b60038560405162001397919062001bf3565b908152604051908190036020019020620013b360018462001f27565b81548110620013c657620013c662001e62565b6000918252602090912001546040516001600160a01b0390911690600390620013f190889062001bf3565b9081526020016040518091039020828154811062001413576200141362001e62565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060038560405162001453919062001bf3565b908152602001604051809103902080548062001473576200147362001f41565b600082815260209020810160001990810180546001600160a01b03191690550190555b80620014a28162001e78565b9150506200131d565b506040516001600160a01b03841681527fff88a3b6ae790816ff4f385e4c1acba5a2f5abd3972c4a3c99aa212d8a46f6c39060200160405180910390a1505050505050565b6001600160a01b03163b151590565b6001600160a01b038116620015615760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b606482015260840162000430565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff161562001602578160ff166001148015620015db5750303b155b620015fa5760405162461bcd60e51b8152600401620004309062001f57565b506000919050565b60005460ff8084169116106200162c5760405162461bcd60e51b8152600401620004309062001f57565b506000805460ff191660ff92909216919091179055600190565b919050565b610eca8062001fa683390190565b828054620016679062001cad565b90600052602060002090601f0160209004810192826200168b5760008555620016d6565b82601f10620016a657805160ff1916838001178555620016d6565b82800160010185558215620016d6579182015b82811115620016d6578251825591602001919060010190620016b9565b50620016e492915062001765565b5090565b828054620016f69062001cad565b90600052602060002090601f0160209004810192826200171a5760008555620016d6565b82601f10620017355782800160ff19823516178555620016d6565b82800160010185558215620016d6579182015b82811115620016d657823582559160200191906001019062001748565b5b80821115620016e4576000815560010162001766565b6001600160a01b038116811462000b1c57600080fd5b60008060408385031215620017a657600080fd5b8235620017b3816200177c565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715620018035762001803620017c1565b604052919050565b600067ffffffffffffffff821115620018285762001828620017c1565b50601f01601f191660200190565b600082601f8301126200184857600080fd5b81356200185f62001859826200180b565b620017d7565b8181528460208386010111156200187557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215620018a657600080fd5b823567ffffffffffffffff811115620018be57600080fd5b620018cc8582860162001836565b95602094909401359450505050565b803562001646816200177c565b600080600080600080600080610100898b0312156200190657600080fd5b883567ffffffffffffffff808211156200191f57600080fd5b6200192d8c838d0162001836565b995060208b01359150808211156200194457600080fd5b620019528c838d0162001836565b985060408b01359150808211156200196957600080fd5b620019778c838d0162001836565b975060608b0135965060808b0135955060a08b01359150808211156200199c57600080fd5b50620019ab8b828c0162001836565b935050620019bc60c08a01620018db565b915060e089013590509295985092959890939650565b600060208284031215620019e557600080fd5b813567ffffffffffffffff811115620019fd57600080fd5b62001a0b8482850162001836565b949350505050565b60006020828403121562001a2657600080fd5b813562001a33816200177c565b9392505050565b60005b8381101562001a5757818101518382015260200162001a3d565b8381111562000f395750506000910152565b6000815180845262001a8381602086016020860162001a3a565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101562001af057603f1988860301845262001add85835162001a69565b9450928501929085019060010162001abe565b5092979650505050505050565b60006020828403121562001b1057600080fd5b5035919050565b60208152600062001a33602083018462001a69565b6000806000806060858703121562001b4357600080fd5b843567ffffffffffffffff8082111562001b5c57600080fd5b818701915087601f83011262001b7157600080fd5b81358181111562001b8157600080fd5b88602082850101111562001b9457600080fd5b6020928301965094505085013562001bac816200177c565b91506040850135801515811462001bc257600080fd5b939692955090935050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6000825162001c0781846020870162001a3a565b9190910192915050565b6001600160a01b0384811682528316602082015260606040820181905260009062001c3f9083018462001a69565b95945050505050565b60c08152600062001c5d60c083018962001a69565b828103602084015262001c71818962001a69565b9050828103604084015262001c87818862001a69565b6001600160a01b0396871660608501529490951660808301525060a00152949350505050565b600181811c9082168062001cc257607f821691505b6020821081141562001ce457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562001d4157816000190482111562001d255762001d2562001cea565b8085161562001d3357918102915b93841c939080029062001d05565b509250929050565b60008262001d5a5750600162000b22565b8162001d695750600062000b22565b816001811462001d82576002811462001d8d5762001dad565b600191505062000b22565b60ff84111562001da15762001da162001cea565b50506001821b62000b22565b5060208310610133831016604e8410600b841016171562001dd2575081810a62000b22565b62001dde838362001d00565b806000190482111562001df55762001df562001cea565b029392505050565b600062001a33838362001d49565b8183823760009101908152919050565b6060815283606082015283856080830137600060808583018101919091526001600160a01b039384166020830152919092166040830152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b600060001982141562001e8f5762001e8f62001cea565b5060010190565b60006020828403121562001ea957600080fd5b5051919050565b60006020828403121562001ec357600080fd5b815167ffffffffffffffff81111562001edb57600080fd5b8201601f8101841362001eed57600080fd5b805162001efe62001859826200180b565b81815285602083850101111562001f1457600080fd5b62001c3f82602083016020860162001a3a565b60008282101562001f3c5762001f3c62001cea565b500390565b634e487b7160e01b600052603160045260246000fd5b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b60608201526080019056fe608060405260405162000eca38038062000eca83398101604081905262000026916200051f565b82828282816200005860017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd620005ff565b60008051602062000e838339815191521462000078576200007862000625565b6200008682826000620000ed565b50620000b6905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005ff565b60008051602062000e6383398151915214620000d657620000d662000625565b620000e1826200012a565b5050505050506200068e565b620000f88362000185565b600082511180620001065750805b156200012557620001238383620001c760201b620002581760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000155620001f6565b604080516001600160a01b03928316815291841660208301520160405180910390a162000182816200022f565b50565b6200019081620002e4565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060620001ef838360405180606001604052806027815260200162000ea36027913962000387565b9392505050565b60006200022060008051602062000e6383398151915260001b6200046d60201b620002001760201c565b546001600160a01b0316919050565b6001600160a01b0381166200029a5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002c360008051602062000e6383398151915260001b6200046d60201b620002001760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002fa816200047060201b620002841760201c565b6200035e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000291565b80620002c360008051602062000e8383398151915260001b6200046d60201b620002001760201c565b60606001600160a01b0384163b620003f15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840162000291565b600080856001600160a01b0316856040516200040e91906200063b565b600060405180830381855af49150503d80600081146200044b576040519150601f19603f3d011682016040523d82523d6000602084013e62000450565b606091505b509092509050620004638282866200047f565b9695505050505050565b90565b6001600160a01b03163b151590565b6060831562000490575081620001ef565b825115620004a15782518084602001fd5b8160405162461bcd60e51b815260040162000291919062000659565b80516001600160a01b0381168114620004d557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200050d578181015183820152602001620004f3565b83811115620001235750506000910152565b6000806000606084860312156200053557600080fd5b6200054084620004bd565b92506200055060208501620004bd565b60408501519092506001600160401b03808211156200056e57600080fd5b818601915086601f8301126200058357600080fd5b815181811115620005985762000598620004da565b604051601f8201601f19908116603f01168101908382118183101715620005c357620005c3620004da565b81604052828152896020848701011115620005dd57600080fd5b620005f0836020830160208801620004f0565b80955050505050509250925092565b6000828210156200062057634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b600082516200064f818460208701620004f0565b9190910192915050565b60208152600082518060208401526200067a816040850160208701620004f0565b601f01601f19169190910160400192915050565b6107c5806200069e6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b61008036600461064f565b610110565b61005b61009336600461066a565b610157565b3480156100a457600080fd5b506100ad6101c8565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e436600461064f565b610203565b3480156100f557600080fd5b506100ad61022d565b61010e610109610293565b61029d565b565b6101186102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c816040518060200160405280600081525060006102f4565b50565b61014c6100fe565b61015f6102c1565b6001600160a01b0316336001600160a01b031614156101c0576101bb8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506102f4915050565b505050565b6101bb6100fe565b60006101d26102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f3610293565b905090565b6102006100fe565b90565b61020b6102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c8161031f565b60006102376102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f36102c1565b606061027d838360405180606001604052806027815260200161076960279139610373565b9392505050565b6001600160a01b03163b151590565b60006101f3610455565b3660008037600080366000845af43d6000803e8080156102bc573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6102fd8361047d565b60008251118061030a5750805b156101bb576103198383610258565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103486102c1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014c816104bd565b60606001600160a01b0384163b6103e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516103fb9190610719565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044b828286610566565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102e5565b6104868161059f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105225760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d7565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561057557508161027d565b8251156105855782518084602001fd5b8160405162461bcd60e51b81526004016103d79190610735565b6001600160a01b0381163b61060c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016103d7565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610545565b80356001600160a01b038116811461064a57600080fd5b919050565b60006020828403121561066157600080fd5b61027d82610633565b60008060006040848603121561067f57600080fd5b61068884610633565b9250602084013567ffffffffffffffff808211156106a557600080fd5b818601915086601f8301126106b957600080fd5b8135818111156106c857600080fd5b8760208285010111156106da57600080fd5b6020830194508093505050509250925092565b60005b838110156107085781810151838201526020016106f0565b838111156103195750506000910152565b6000825161072b8184602087016106ed565b9190910192915050565b60208152600082518060208401526107548160408501602087016106ed565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9e1fbe41895f8bf7249337aca83abf16214aebbd0a1f744a3df3f57c9c8a4e264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122094cbffb2a4f5a069670414b01778a4573e5b7bf4c495938c3b992ce65a34cae564736f6c63430008090033", + "devdoc": { + "kind": "dev", + "methods": {}, + "stateVariables": { + "PERCENTAGE_FACTOR": { + "details": "factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%; Calculation formula: x * percentage / PERCENTAGE_FACTOR" + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 6, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 9, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 3778, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "admin", + "offset": 2, + "slot": "0", + "type": "t_address" + }, + { + "astId": 2518, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "bondImplementations", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_string_memory_ptr,t_address)" + }, + { + "astId": 2523, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "kindBondsMapping", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)" + }, + { + "astId": 2528, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "seriesBondsMapping", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)" + }, + { + "astId": 2531, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "bondKinds", + "offset": 0, + "slot": "4", + "type": "t_array(t_string_storage)dyn_storage" + }, + { + "astId": 2534, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "bondSeries", + "offset": 0, + "slot": "5", + "type": "t_array(t_string_storage)dyn_storage" + }, + { + "astId": 2538, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "bondPrices", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_string_storage)dyn_storage": { + "base": "t_string_storage", + "encoding": "dynamic_array", + "label": "string[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_string_memory_ptr,t_address)": { + "encoding": "mapping", + "key": "t_string_memory_ptr", + "label": "mapping(string => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)": { + "encoding": "mapping", + "key": "t_string_memory_ptr", + "label": "mapping(string => address[])", + "numberOfBytes": "32", + "value": "t_array(t_address)dyn_storage" + }, + "t_string_memory_ptr": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Proxy.json b/packages/bonds/deployments/bsctest/BondFactory_Proxy.json similarity index 90% rename from packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Proxy.json rename to packages/bonds/deployments/bsctest/BondFactory_Proxy.json index ebfc9c0..a21f824 100644 --- a/packages/bonds/deployments/bsctest/AccidentHandler20220715V3_Proxy.json +++ b/packages/bonds/deployments/bsctest/BondFactory_Proxy.json @@ -1,5 +1,5 @@ { - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "abi": [ { "inputs": [ @@ -145,81 +145,84 @@ "type": "receive" } ], - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", "receipt": { "to": null, - "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", - "contractAddress": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", - "transactionIndex": 6, - "gasUsed": "692987", - "logsBloom": "0x00000000040000000000000000010000000000000000000000800000000000000000000800000000000400000000000000000000000004000000000000000000011000000000000000000000000000000001000000000000000200000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000020000000000080000000800000000000000000000000000000000000000600000000000000000000000000000000000008000000000008000000000000040000000000000000000000000000000020000000000000000000000400000000000000000000000000000000000000000000", - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163", - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", + "from": "0xe7a2b8c8fed53713f69227e6c3d2384e80cf88a6", + "contractAddress": "0x4245d080839ddad01af007c196b02ba26c842baf", + "transactionIndex": "0x0", + "gasUsed": "0xa3fd4", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800001000000000000000000000000000440000000000000000000000004000000000000000000001000000000000000000000000000000001000000000000000200000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000020000000000080000000000000000000000000000000000000000000000600000000000000000000000000000000008000000000000108000000000000040000000000000000004000000000000020000000000000000000000400000008000000000000000000000000000000000000", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", "logs": [ { - "transactionIndex": 6, - "blockNumber": 21796345, - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "topics": [ "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000001a197925bfb0fc07fb6323fd40a9a98485720c6a" + "0x000000000000000000000000c2720bc2c5a99dcca5d623df513423c3c794754b" ], "data": "0x", - "logIndex": 7, - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x0", + "removed": false }, { - "transactionIndex": 6, - "blockNumber": 21796345, - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "topics": [ "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6", "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" ], "data": "0x", - "logIndex": 8, - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x1", + "removed": false }, { - "transactionIndex": 6, - "blockNumber": 21796345, - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "topics": [ "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" ], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 9, - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x2", + "removed": false }, { - "transactionIndex": 6, - "blockNumber": 21796345, - "transactionHash": "0x8d640f1dd0c631b9580b3e273bde095d5d75bb54629f50aca8ceb80e0cd1e677", - "address": "0xf750cDcF870850c26c8CF7908c49939eb012D0A3", + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" ], "data": "0x", - "logIndex": 10, - "blockHash": "0x9156b5e30ea8199badd8ff742ac974684d5e0b6d4f8b07c8885762e53d2f9163" + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x3", + "removed": false } ], - "blockNumber": 21796345, - "cumulativeGasUsed": "970069", - "status": 1, - "byzantium": true + "blockNumber": "0x171b5b7", + "cumulativeGasUsed": "0xa3fd4", + "status": "0x1" }, "args": [ - "0x1A197925BFB0fc07FB6323FD40a9A98485720C6A", + "0xC2720Bc2C5a99DCCA5d623df513423c3C794754B", "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", - "0xcd6dc687000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a600000000000000000000000000000000000000000000000000000000634289d3" + "0xc4d66de8000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" ], "numDeployments": 1, "solcInputHash": "41a8600e180880fe88609322a6b2ac21", diff --git a/packages/bonds/deployments/bsctest/DiscountBond.json b/packages/bonds/deployments/bsctest/DiscountBond.json new file mode 100644 index 0000000..c50bdb0 --- /dev/null +++ b/packages/bonds/deployments/bsctest/DiscountBond.json @@ -0,0 +1,1074 @@ +{ + "address": "0x8b90EF85FeAC96E7A2453FE14D5Cb331C2baD374", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "inventoryAmount", + "type": "uint256" + } + ], + "name": "BondGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bondAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "underlyingAmount", + "type": "uint256" + } + ], + "name": "BondMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BondRedeemed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bondAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "underlyingAmount", + "type": "uint256" + } + ], + "name": "BondSold", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "MIN_TRADING_AMOUNT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "bondAmount_", + "type": "uint256" + } + ], + "name": "amountToUnderlying", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "token_", + "type": "address" + }, + { + "internalType": "address", + "name": "to_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "emergencyWithdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "bondAmount_", + "type": "uint256" + } + ], + "name": "faceValue", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "factory", + "outputs": [ + { + "internalType": "contract IBondFactory", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + } + ], + "name": "grant", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name_", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol_", + "type": "string" + }, + { + "internalType": "string", + "name": "series_", + "type": "string" + }, + { + "internalType": "address", + "name": "factory_", + "type": "address" + }, + { + "internalType": "contract IERC20Upgradeable", + "name": "underlyingToken_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maturity_", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "inventoryAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "kind", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maturity", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bondAmount_", + "type": "uint256" + } + ], + "name": "mintByBondAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "underlyingAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "underlyingAmount_", + "type": "uint256" + } + ], + "name": "mintByUnderlyingAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "bondAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "bondAmount_", + "type": "uint256" + } + ], + "name": "previewMintByBondAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "underlyingAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "underlyingAmount_", + "type": "uint256" + } + ], + "name": "previewMintByUnderlyingAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "bondAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "bondAmount_", + "type": "uint256" + } + ], + "name": "previewSellByBondAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "underlyingAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "bondAmount_", + "type": "uint256" + } + ], + "name": "redeem", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account_", + "type": "address" + }, + { + "internalType": "uint256", + "name": "bondAmount_", + "type": "uint256" + } + ], + "name": "redeemFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "redeemedAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "bondAmount_", + "type": "uint256" + } + ], + "name": "sellByBondAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "underlyingAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "series", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount_", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to_", + "type": "address" + } + ], + "name": "underlyingOut", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "underlyingToken", + "outputs": [ + { + "internalType": "contract IERC20Upgradeable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x3783086ac5181a6b97b0de64f21f9da3e9f65c6f6025e2941d978e9dd3dbb066", + "receipt": { + "to": null, + "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "contractAddress": "0x8b90EF85FeAC96E7A2453FE14D5Cb331C2baD374", + "transactionIndex": 4, + "gasUsed": "1975262", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000010000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x83b0df5d6be26e9dd7a11d8cbe313911617e7c68c8148119812e154ebabc1ce5", + "transactionHash": "0x3783086ac5181a6b97b0de64f21f9da3e9f65c6f6025e2941d978e9dd3dbb066", + "logs": [ + { + "transactionIndex": 4, + "blockNumber": 24229784, + "transactionHash": "0x3783086ac5181a6b97b0de64f21f9da3e9f65c6f6025e2941d978e9dd3dbb066", + "address": "0x8b90EF85FeAC96E7A2453FE14D5Cb331C2baD374", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 6, + "blockHash": "0x83b0df5d6be26e9dd7a11d8cbe313911617e7c68c8148119812e154ebabc1ce5" + } + ], + "blockNumber": 24229784, + "cumulativeGasUsed": "6199426", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 8, + "solcInputHash": "86b5d7bad88174195e885f97b1fed94c", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"inventoryAmount\",\"type\":\"uint256\"}],\"name\":\"BondGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"name\":\"BondMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BondRedeemed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"name\":\"BondSold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MIN_TRADING_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"amountToUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"token_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"emergencyWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"faceValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"contract IBondFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"grant\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"series_\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"factory_\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"underlyingToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maturity_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inventoryAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kind\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maturity\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"mintByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"underlyingAmount_\",\"type\":\"uint256\"}],\"name\":\"mintByUnderlyingAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"previewMintByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount_\",\"type\":\"uint256\"}],\"name\":\"previewMintByUnderlyingAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"previewSellByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"redeemFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"redeemedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"sellByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"series\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to_\",\"type\":\"address\"}],\"name\":\"underlyingOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlyingToken\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"grant(uint256)\":{\"details\":\"grant specific amount of bond for user mint.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DiscountBond.sol\":\"DiscountBond\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x041af89e5e60b74e1203d5a34614c9de379726f52ecb8cf064cab78b9fdcdf9d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"./extensions/IERC20MetadataUpgradeable.sol\\\";\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\\n __ERC20_init_unchained(name_, symbol_);\\n }\\n\\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[45] private __gap;\\n}\\n\",\"keccak256\":\"0xb71b875e7f1b8ad082eb6ff83bca4bfa7d050476cc98fd39295826b654edfb46\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x605434219ebbe4653f703640f06969faa5a1d78f0bfef878e5ddbb1ca369ceeb\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n function safeTransfer(\\n IERC20Upgradeable token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20Upgradeable token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3e26a49d2fa5ef8338b8a9467c91e54f417cb07e849b1cc0f4ebc4d2a147938e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"contracts/DiscountBond.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"./interfaces/IBond.sol\\\";\\nimport \\\"./interfaces/IBondFactory.sol\\\";\\n\\ncontract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n string public constant kind = \\\"Discount\\\";\\n uint256 public constant MIN_TRADING_AMOUNT = 1e12;\\n\\n IBondFactory public factory;\\n IERC20Upgradeable public underlyingToken;\\n uint256 public maturity;\\n string public series;\\n uint256 public inventoryAmount;\\n uint256 public redeemedAmount;\\n\\n event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\\n event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\\n event BondRedeemed(address indexed account, uint256 amount);\\n event BondGranted(uint256 amount, uint256 inventoryAmount);\\n\\n constructor() initializer {}\\n\\n function initialize(\\n string memory name_,\\n string memory symbol_,\\n string memory series_,\\n address factory_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_\\n ) external initializer {\\n __ERC20_init(name_, symbol_);\\n __ReentrancyGuard_init();\\n require(\\n maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days),\\n \\\"DiscountBond: INVALID_MATURITY\\\"\\n );\\n series = series_;\\n underlyingToken = underlyingToken_;\\n factory = IBondFactory(factory_);\\n maturity = maturity_;\\n }\\n\\n modifier beforeMaturity() {\\n require(block.timestamp < maturity, \\\"DiscountBond: MUST_BEFORE_MATURITY\\\");\\n _;\\n }\\n\\n modifier afterMaturity() {\\n require(block.timestamp >= maturity, \\\"DiscountBond: MUST_AFTER_MATURITY\\\");\\n _;\\n }\\n\\n modifier tradingGuard() {\\n require(getPrice() > 0, \\\"INVALID_PRICE\\\");\\n _;\\n }\\n\\n modifier onlyFactory() {\\n require(msg.sender == address(factory), \\\"DiscountBond: UNAUTHORIZED\\\");\\n _;\\n }\\n\\n /**\\n * @dev grant specific amount of bond for user mint.\\n */\\n function grant(uint256 amount_) external onlyFactory {\\n inventoryAmount += amount_;\\n emit BondGranted(amount_, inventoryAmount);\\n }\\n\\n function getPrice() public view returns (uint256) {\\n return factory.getPrice(address(this));\\n }\\n\\n function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_)\\n external\\n beforeMaturity\\n returns (uint256 bondAmount)\\n {\\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_);\\n bondAmount = previewMintByUnderlyingAmount(underlyingAmount_);\\n inventoryAmount -= bondAmount;\\n _mint(account_, bondAmount);\\n emit BondMinted(account_, bondAmount, underlyingAmount_);\\n }\\n\\n function previewMintByUnderlyingAmount(uint256 underlyingAmount_)\\n public\\n view\\n beforeMaturity\\n tradingGuard\\n returns (uint256 bondAmount)\\n {\\n require(underlyingAmount_ >= MIN_TRADING_AMOUNT, \\\"DiscountBond: AMOUNT_TOO_LOW\\\");\\n bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice();\\n require(inventoryAmount >= bondAmount, \\\"DiscountBond: INSUFFICIENT_LIQUIDITY\\\");\\n }\\n\\n function mintByBondAmount(address account_, uint256 bondAmount_)\\n external\\n beforeMaturity\\n returns (uint256 underlyingAmount)\\n {\\n underlyingAmount = previewMintByBondAmount(bondAmount_);\\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount);\\n inventoryAmount -= bondAmount_;\\n _mint(account_, bondAmount_);\\n emit BondMinted(account_, bondAmount_, underlyingAmount);\\n }\\n\\n function previewMintByBondAmount(uint256 bondAmount_)\\n public\\n view\\n beforeMaturity\\n tradingGuard\\n returns (uint256 underlyingAmount)\\n {\\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \\\"DiscountBond: AMOUNT_TOO_LOW\\\");\\n require(inventoryAmount >= bondAmount_, \\\"DiscountBond: INSUFFICIENT_LIQUIDITY\\\");\\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\\n }\\n\\n function sellByBondAmount(uint256 bondAmount_)\\n public\\n beforeMaturity\\n tradingGuard\\n returns (uint256 underlyingAmount)\\n {\\n underlyingAmount = previewSellByBondAmount(bondAmount_);\\n _burn(msg.sender, bondAmount_);\\n inventoryAmount += bondAmount_;\\n underlyingToken.safeTransfer(msg.sender, underlyingAmount);\\n emit BondSold(msg.sender, bondAmount_, underlyingAmount);\\n }\\n\\n function previewSellByBondAmount(uint256 bondAmount_)\\n public\\n view\\n beforeMaturity\\n tradingGuard\\n returns (uint256 underlyingAmount)\\n {\\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \\\"DiscountBond: AMOUNT_TOO_LOW\\\");\\n require(balanceOf(msg.sender) >= bondAmount_, \\\"DiscountBond: EXCEEDS_BALANCE\\\");\\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\\n require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, \\\"DiscountBond: INSUFFICIENT_LIQUIDITY\\\");\\n }\\n\\n function redeem(uint256 bondAmount_) public {\\n redeemFor(msg.sender, bondAmount_);\\n }\\n\\n function faceValue(uint256 bondAmount_) public view returns (uint256) {\\n return bondAmount_;\\n }\\n\\n function amountToUnderlying(uint256 bondAmount_) public view returns (uint256) {\\n if (block.timestamp >= maturity) {\\n return faceValue(bondAmount_);\\n }\\n return (bondAmount_ * getPrice()) / factory.priceFactor();\\n }\\n\\n function redeemFor(address account_, uint256 bondAmount_) public afterMaturity {\\n require(balanceOf(msg.sender) >= bondAmount_, \\\"DiscountBond: EXCEEDS_BALANCE\\\");\\n _burn(msg.sender, bondAmount_);\\n redeemedAmount += bondAmount_;\\n underlyingToken.safeTransfer(account_, bondAmount_);\\n emit BondRedeemed(account_, bondAmount_);\\n }\\n\\n /**\\n * @notice\\n */\\n function underlyingOut(uint256 amount_, address to_) external onlyFactory {\\n underlyingToken.safeTransfer(to_, amount_);\\n }\\n\\n function emergencyWithdraw(\\n IERC20Upgradeable token_,\\n address to_,\\n uint256 amount_\\n ) external onlyFactory {\\n token_.safeTransfer(to_, amount_);\\n }\\n}\\n\",\"keccak256\":\"0x41f040faf64c8bc5073db251b6bb0a5a50ecf3183232dc5277dcc641f6759771\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBond.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface IBond is IERC20Upgradeable {\\n function initialize(\\n string memory name_,\\n string memory symbol_,\\n string memory series,\\n address factory_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_\\n ) external;\\n\\n function kind() external returns (string memory);\\n\\n function series() external returns (string memory);\\n\\n function underlyingOut(uint256 amount_, address to_) external;\\n\\n function grant(uint256 amount_) external;\\n\\n function faceValue(uint256 bondAmount_) external view returns (uint256);\\n\\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x2e6653c949a3ae433a1e7ed6c7fd37b3886cd073be18d9c5e9402358cf36e8ff\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBondFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\ninterface IBondFactory {\\n function priceFactor() external view returns (uint256);\\n\\n function getPrice(address bondToken_) external view returns (uint256 price);\\n}\\n\",\"keccak256\":\"0x43ebf47455cddb545064cb42203f7973492dbf15c1e7204d5c0fefbd8aea8e23\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50600062000020600162000087565b9050801562000039576000805461ff0019166101001790555b801562000080576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50620001a8565b60008054610100900460ff161562000120578160ff166001148015620000c05750620000be306200019960201b620011c11760201c565b155b620001185760405162461bcd60e51b815260206004820152602e6024820152600080516020620023e083398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff8084169116106200017f5760405162461bcd60e51b815260206004820152602e6024820152600080516020620023e083398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016200010f565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b61222880620001b86000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806395d89b411161011a578063c45a0155116100ad578063e63ea4081161007c578063e63ea40814610455578063f12d870f14610468578063fc48e64214610470578063fde2ba8c14610483578063fe8dbd8e1461049657600080fd5b8063c45a015514610409578063da7b038b1461041c578063db006a751461042f578063dd62ed3e1461044257600080fd5b8063a457c2d7116100e9578063a457c2d7146103c7578063a7731842146103da578063a9059cbb146103e3578063c0da2885146103f657600080fd5b806395d89b411461039157806396e35cea1461039957806398d5fdca146103ac57806398ecd688146103b457600080fd5b806323b872dd1161019d578063395093511161016c578063395093511461031c5780633ce896b81461032f5780634cb4bdc91461034257806370a08231146103555780637a82a1981461037e57600080fd5b806323b872dd146102c65780632491510a146102d95780632495a599146102e2578063313ce5671461030d57600080fd5b80630d6c2618116101d95780630d6c261814610294578063160e3f3d146102a057806318160ddd146102b5578063204f83f9146102bd57600080fd5b806304baa00b1461020b57806306d914061461024857806306fdde0314610269578063095ea7b314610271575b600080fd5b61023260405180604001604052806008815260200167111a5cd8dbdd5b9d60c21b81525081565b60405161023f9190611c82565b60405180910390f35b61025b610256366004611cca565b6104a7565b60405190815260200161023f565b610232610563565b61028461027f366004611cca565b6105f5565b604051901515815260200161023f565b61025b64e8d4a5100081565b6102b36102ae366004611cf6565b61060d565b005b60355461025b565b61025b60995481565b6102846102d4366004611d0f565b61068e565b61025b609b5481565b6098546102f5906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b6040516012815260200161023f565b61028461032a366004611cca565b6106b4565b61025b61033d366004611cca565b6106d6565b61025b610350366004611cf6565b610780565b61025b610363366004611d50565b6001600160a01b031660009081526033602052604090205490565b6102b361038c366004611cca565b610993565b610232610acd565b6102b36103a7366004611e10565b610adc565b61025b610c12565b61025b6103c2366004611cf6565b610c93565b6102846103d5366004611cca565b610d60565b61025b609c5481565b6102846103f1366004611cca565b610de6565b61025b610404366004611cf6565b610df4565b6097546102f5906001600160a01b031681565b61025b61042a366004611cf6565b610f2d565b6102b361043d366004611cf6565b610f3e565b61025b610450366004611ec8565b610f4b565b6102b3610463366004611d0f565b610f76565b610232610fb9565b61025b61047e366004611cf6565b611047565b6102b3610491366004611f01565b61117c565b61025b6104a4366004611cf6565b90565b600060995442106104d35760405162461bcd60e51b81526004016104ca90611f26565b60405180910390fd5b6098546104eb906001600160a01b03163330856111d0565b6104f482611047565b905080609b60008282546105089190611f7e565b9091555061051890508382611241565b60408051828152602081018490526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca91015b60405180910390a292915050565b60606036805461057290611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461059e90611f95565b80156105eb5780601f106105c0576101008083540402835291602001916105eb565b820191906000526020600020905b8154815290600101906020018083116105ce57829003601f168201915b5050505050905090565b600033610603818585611320565b5060019392505050565b6097546001600160a01b031633146106375760405162461bcd60e51b81526004016104ca90611fd0565b80609b60008282546106499190612007565b9091555050609b546040805183815260208101929092527f632d02909e5759576f4a85e32a3793720a7ca5319576cc41010c4217ddbad0e9910160405180910390a150565b60003361069c858285611444565b6106a78585856114b8565b60019150505b9392505050565b6000336106038185856106c78383610f4b565b6106d19190612007565b611320565b600060995442106106f95760405162461bcd60e51b81526004016104ca90611f26565b61070282610df4565b60985490915061071d906001600160a01b03163330846111d0565b81609b600082825461072f9190611f7e565b9091555061073f90508383611241565b60408051838152602081018390526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca9101610555565b600060995442106107a35760405162461bcd60e51b81526004016104ca90611f26565b60006107ad610c12565b116107ca5760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a510008210156107ef5760405162461bcd60e51b81526004016104ca90612046565b3360009081526033602052604090205482111561084e5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e434500000060448201526064016104ca565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561089c57600080fd5b505afa1580156108b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d4919061207d565b6108dc610c12565b6108e69084612096565b6108f091906120b5565b6098546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b15801561093857600080fd5b505afa15801561094c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610970919061207d565b101561098e5760405162461bcd60e51b81526004016104ca906120d7565b919050565b6099544210156109ef5760405162461bcd60e51b815260206004820152602160248201527f446973636f756e74426f6e643a204d5553545f41465445525f4d4154555249546044820152605960f81b60648201526084016104ca565b33600090815260336020526040902054811115610a4e5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e434500000060448201526064016104ca565b610a583382611686565b80609c6000828254610a6a9190612007565b9091555050609854610a86906001600160a01b031683836117d4565b816001600160a01b03167fbbb59c50b3cd05fe4982a9bc1fbab45bd421ac707f4fba6b080522e3a9cc03b382604051610ac191815260200190565b60405180910390a25050565b60606037805461057290611f95565b6000610ae86001611804565b90508015610b00576000805461ff0019166101001790555b610b0a878761188c565b610b126118bd565b4282118015610b2e5750610b2a426325980600612007565b8211155b610b7a5760405162461bcd60e51b815260206004820152601e60248201527f446973636f756e74426f6e643a20494e56414c49445f4d41545552495459000060448201526064016104ca565b8451610b8d90609a906020880190611bbd565b50609880546001600160a01b038086166001600160a01b031992831617909255609780549287169290911691909117905560998290558015610c09576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6097546040516341976e0960e01b81523060048201526000916001600160a01b0316906341976e099060240160206040518083038186803b158015610c5657600080fd5b505afa158015610c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8e919061207d565b905090565b60006099544210610cb65760405162461bcd60e51b81526004016104ca90611f26565b6000610cc0610c12565b11610cdd5760405162461bcd60e51b81526004016104ca9061201f565b610ce682610780565b9050610cf23383611686565b81609b6000828254610d049190612007565b9091555050609854610d20906001600160a01b031633836117d4565b604080518381526020810183905233917f3dbe987d8c318f20a1d550dd52db9a8a20cc25aab2f175c7ccafb306ee48d210910160405180910390a2919050565b60003381610d6e8286610f4b565b905083811015610dce5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104ca565b610ddb8286868403611320565b506001949350505050565b6000336106038185856114b8565b60006099544210610e175760405162461bcd60e51b81526004016104ca90611f26565b6000610e21610c12565b11610e3e5760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a51000821015610e635760405162461bcd60e51b81526004016104ca90612046565b81609b541015610e855760405162461bcd60e51b81526004016104ca906120d7565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b919061207d565b610f13610c12565b610f1d9084612096565b610f2791906120b5565b92915050565b60006099544210610e855781610f27565b610f483382610993565b50565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6097546001600160a01b03163314610fa05760405162461bcd60e51b81526004016104ca90611fd0565b610fb46001600160a01b03841683836117d4565b505050565b609a8054610fc690611f95565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff290611f95565b801561103f5780601f106110145761010080835404028352916020019161103f565b820191906000526020600020905b81548152906001019060200180831161102257829003601f168201915b505050505081565b6000609954421061106a5760405162461bcd60e51b81526004016104ca90611f26565b6000611074610c12565b116110915760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a510008210156110b65760405162461bcd60e51b81526004016104ca90612046565b6110be610c12565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561110c57600080fd5b505afa158015611120573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611144919061207d565b61114e9084612096565b61115891906120b5565b905080609b54101561098e5760405162461bcd60e51b81526004016104ca906120d7565b6097546001600160a01b031633146111a65760405162461bcd60e51b81526004016104ca90611fd0565b6098546111bd906001600160a01b031682846117d4565b5050565b6001600160a01b03163b151590565b6040516001600160a01b038085166024830152831660448201526064810182905261123b9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118ee565b50505050565b6001600160a01b0382166112975760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104ca565b80603560008282546112a99190612007565b90915550506001600160a01b038216600090815260336020526040812080548392906112d6908490612007565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166113825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104ca565b6001600160a01b0382166113e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104ca565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006114508484610f4b565b9050600019811461123b57818110156114ab5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104ca565b61123b8484848403611320565b6001600160a01b03831661151c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104ca565b6001600160a01b03821661157e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104ca565b6001600160a01b038316600090815260336020526040902054818110156115f65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104ca565b6001600160a01b0380851660009081526033602052604080822085850390559185168152908120805484929061162d908490612007565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167991815260200190565b60405180910390a361123b565b6001600160a01b0382166116e65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104ca565b6001600160a01b0382166000908152603360205260409020548181101561175a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104ca565b6001600160a01b0383166000908152603360205260408120838303905560358054849290611789908490611f7e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b038316602482015260448101829052610fb490849063a9059cbb60e01b90606401611204565b60008054610100900460ff161561184b578160ff1660011480156118275750303b155b6118435760405162461bcd60e51b81526004016104ca9061211b565b506000919050565b60005460ff8084169116106118725760405162461bcd60e51b81526004016104ca9061211b565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff166118b35760405162461bcd60e51b81526004016104ca90612169565b6111bd82826119c0565b600054610100900460ff166118e45760405162461bcd60e51b81526004016104ca90612169565b6118ec611a0e565b565b6000611943826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a3c9092919063ffffffff16565b805190915015610fb4578080602001905181019061196191906121b4565b610fb45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104ca565b600054610100900460ff166119e75760405162461bcd60e51b81526004016104ca90612169565b81516119fa906036906020850190611bbd565b508051610fb4906037906020840190611bbd565b600054610100900460ff16611a355760405162461bcd60e51b81526004016104ca90612169565b6001606555565b6060611a4b8484600085611a53565b949350505050565b606082471015611ab45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104ca565b6001600160a01b0385163b611b0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104ca565b600080866001600160a01b03168587604051611b2791906121d6565b60006040518083038185875af1925050503d8060008114611b64576040519150601f19603f3d011682016040523d82523d6000602084013e611b69565b606091505b5091509150611b79828286611b84565b979650505050505050565b60608315611b935750816106ad565b825115611ba35782518084602001fd5b8160405162461bcd60e51b81526004016104ca9190611c82565b828054611bc990611f95565b90600052602060002090601f016020900481019282611beb5760008555611c31565b82601f10611c0457805160ff1916838001178555611c31565b82800160010185558215611c31579182015b82811115611c31578251825591602001919060010190611c16565b50611c3d929150611c41565b5090565b5b80821115611c3d5760008155600101611c42565b60005b83811015611c71578181015183820152602001611c59565b8381111561123b5750506000910152565b6020815260008251806020840152611ca1816040850160208701611c56565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610f4857600080fd5b60008060408385031215611cdd57600080fd5b8235611ce881611cb5565b946020939093013593505050565b600060208284031215611d0857600080fd5b5035919050565b600080600060608486031215611d2457600080fd5b8335611d2f81611cb5565b92506020840135611d3f81611cb5565b929592945050506040919091013590565b600060208284031215611d6257600080fd5b81356106ad81611cb5565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d9457600080fd5b813567ffffffffffffffff80821115611daf57611daf611d6d565b604051601f8301601f19908116603f01168101908282118183101715611dd757611dd7611d6d565b81604052838152866020858801011115611df057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c08789031215611e2957600080fd5b863567ffffffffffffffff80821115611e4157600080fd5b611e4d8a838b01611d83565b97506020890135915080821115611e6357600080fd5b611e6f8a838b01611d83565b96506040890135915080821115611e8557600080fd5b50611e9289828a01611d83565b9450506060870135611ea381611cb5565b92506080870135611eb381611cb5565b8092505060a087013590509295509295509295565b60008060408385031215611edb57600080fd5b8235611ee681611cb5565b91506020830135611ef681611cb5565b809150509250929050565b60008060408385031215611f1457600080fd5b823591506020830135611ef681611cb5565b60208082526022908201527f446973636f756e74426f6e643a204d5553545f4245464f52455f4d4154555249604082015261545960f01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611f9057611f90611f68565b500390565b600181811c90821680611fa957607f821691505b60208210811415611fca57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f446973636f756e74426f6e643a20554e415554484f52495a4544000000000000604082015260600190565b6000821982111561201a5761201a611f68565b500190565b6020808252600d908201526c494e56414c49445f505249434560981b604082015260600190565b6020808252601c908201527f446973636f756e74426f6e643a20414d4f554e545f544f4f5f4c4f5700000000604082015260600190565b60006020828403121561208f57600080fd5b5051919050565b60008160001904831182151516156120b0576120b0611f68565b500290565b6000826120d257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f446973636f756e74426f6e643a20494e53554646494349454e545f4c495155496040820152634449545960e01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156121c657600080fd5b815180151581146106ad57600080fd5b600082516121e8818460208701611c56565b919091019291505056fea26469706673582212200271260375176e7f9e8b338e9e48b6eaa2d859cdce139e2cd0ea55af762055b064736f6c63430008090033496e697469616c697a61626c653a20636f6e747261637420697320616c726561", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806395d89b411161011a578063c45a0155116100ad578063e63ea4081161007c578063e63ea40814610455578063f12d870f14610468578063fc48e64214610470578063fde2ba8c14610483578063fe8dbd8e1461049657600080fd5b8063c45a015514610409578063da7b038b1461041c578063db006a751461042f578063dd62ed3e1461044257600080fd5b8063a457c2d7116100e9578063a457c2d7146103c7578063a7731842146103da578063a9059cbb146103e3578063c0da2885146103f657600080fd5b806395d89b411461039157806396e35cea1461039957806398d5fdca146103ac57806398ecd688146103b457600080fd5b806323b872dd1161019d578063395093511161016c578063395093511461031c5780633ce896b81461032f5780634cb4bdc91461034257806370a08231146103555780637a82a1981461037e57600080fd5b806323b872dd146102c65780632491510a146102d95780632495a599146102e2578063313ce5671461030d57600080fd5b80630d6c2618116101d95780630d6c261814610294578063160e3f3d146102a057806318160ddd146102b5578063204f83f9146102bd57600080fd5b806304baa00b1461020b57806306d914061461024857806306fdde0314610269578063095ea7b314610271575b600080fd5b61023260405180604001604052806008815260200167111a5cd8dbdd5b9d60c21b81525081565b60405161023f9190611c82565b60405180910390f35b61025b610256366004611cca565b6104a7565b60405190815260200161023f565b610232610563565b61028461027f366004611cca565b6105f5565b604051901515815260200161023f565b61025b64e8d4a5100081565b6102b36102ae366004611cf6565b61060d565b005b60355461025b565b61025b60995481565b6102846102d4366004611d0f565b61068e565b61025b609b5481565b6098546102f5906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b6040516012815260200161023f565b61028461032a366004611cca565b6106b4565b61025b61033d366004611cca565b6106d6565b61025b610350366004611cf6565b610780565b61025b610363366004611d50565b6001600160a01b031660009081526033602052604090205490565b6102b361038c366004611cca565b610993565b610232610acd565b6102b36103a7366004611e10565b610adc565b61025b610c12565b61025b6103c2366004611cf6565b610c93565b6102846103d5366004611cca565b610d60565b61025b609c5481565b6102846103f1366004611cca565b610de6565b61025b610404366004611cf6565b610df4565b6097546102f5906001600160a01b031681565b61025b61042a366004611cf6565b610f2d565b6102b361043d366004611cf6565b610f3e565b61025b610450366004611ec8565b610f4b565b6102b3610463366004611d0f565b610f76565b610232610fb9565b61025b61047e366004611cf6565b611047565b6102b3610491366004611f01565b61117c565b61025b6104a4366004611cf6565b90565b600060995442106104d35760405162461bcd60e51b81526004016104ca90611f26565b60405180910390fd5b6098546104eb906001600160a01b03163330856111d0565b6104f482611047565b905080609b60008282546105089190611f7e565b9091555061051890508382611241565b60408051828152602081018490526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca91015b60405180910390a292915050565b60606036805461057290611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461059e90611f95565b80156105eb5780601f106105c0576101008083540402835291602001916105eb565b820191906000526020600020905b8154815290600101906020018083116105ce57829003601f168201915b5050505050905090565b600033610603818585611320565b5060019392505050565b6097546001600160a01b031633146106375760405162461bcd60e51b81526004016104ca90611fd0565b80609b60008282546106499190612007565b9091555050609b546040805183815260208101929092527f632d02909e5759576f4a85e32a3793720a7ca5319576cc41010c4217ddbad0e9910160405180910390a150565b60003361069c858285611444565b6106a78585856114b8565b60019150505b9392505050565b6000336106038185856106c78383610f4b565b6106d19190612007565b611320565b600060995442106106f95760405162461bcd60e51b81526004016104ca90611f26565b61070282610df4565b60985490915061071d906001600160a01b03163330846111d0565b81609b600082825461072f9190611f7e565b9091555061073f90508383611241565b60408051838152602081018390526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca9101610555565b600060995442106107a35760405162461bcd60e51b81526004016104ca90611f26565b60006107ad610c12565b116107ca5760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a510008210156107ef5760405162461bcd60e51b81526004016104ca90612046565b3360009081526033602052604090205482111561084e5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e434500000060448201526064016104ca565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561089c57600080fd5b505afa1580156108b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d4919061207d565b6108dc610c12565b6108e69084612096565b6108f091906120b5565b6098546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b15801561093857600080fd5b505afa15801561094c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610970919061207d565b101561098e5760405162461bcd60e51b81526004016104ca906120d7565b919050565b6099544210156109ef5760405162461bcd60e51b815260206004820152602160248201527f446973636f756e74426f6e643a204d5553545f41465445525f4d4154555249546044820152605960f81b60648201526084016104ca565b33600090815260336020526040902054811115610a4e5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e434500000060448201526064016104ca565b610a583382611686565b80609c6000828254610a6a9190612007565b9091555050609854610a86906001600160a01b031683836117d4565b816001600160a01b03167fbbb59c50b3cd05fe4982a9bc1fbab45bd421ac707f4fba6b080522e3a9cc03b382604051610ac191815260200190565b60405180910390a25050565b60606037805461057290611f95565b6000610ae86001611804565b90508015610b00576000805461ff0019166101001790555b610b0a878761188c565b610b126118bd565b4282118015610b2e5750610b2a426325980600612007565b8211155b610b7a5760405162461bcd60e51b815260206004820152601e60248201527f446973636f756e74426f6e643a20494e56414c49445f4d41545552495459000060448201526064016104ca565b8451610b8d90609a906020880190611bbd565b50609880546001600160a01b038086166001600160a01b031992831617909255609780549287169290911691909117905560998290558015610c09576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6097546040516341976e0960e01b81523060048201526000916001600160a01b0316906341976e099060240160206040518083038186803b158015610c5657600080fd5b505afa158015610c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8e919061207d565b905090565b60006099544210610cb65760405162461bcd60e51b81526004016104ca90611f26565b6000610cc0610c12565b11610cdd5760405162461bcd60e51b81526004016104ca9061201f565b610ce682610780565b9050610cf23383611686565b81609b6000828254610d049190612007565b9091555050609854610d20906001600160a01b031633836117d4565b604080518381526020810183905233917f3dbe987d8c318f20a1d550dd52db9a8a20cc25aab2f175c7ccafb306ee48d210910160405180910390a2919050565b60003381610d6e8286610f4b565b905083811015610dce5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104ca565b610ddb8286868403611320565b506001949350505050565b6000336106038185856114b8565b60006099544210610e175760405162461bcd60e51b81526004016104ca90611f26565b6000610e21610c12565b11610e3e5760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a51000821015610e635760405162461bcd60e51b81526004016104ca90612046565b81609b541015610e855760405162461bcd60e51b81526004016104ca906120d7565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b919061207d565b610f13610c12565b610f1d9084612096565b610f2791906120b5565b92915050565b60006099544210610e855781610f27565b610f483382610993565b50565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6097546001600160a01b03163314610fa05760405162461bcd60e51b81526004016104ca90611fd0565b610fb46001600160a01b03841683836117d4565b505050565b609a8054610fc690611f95565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff290611f95565b801561103f5780601f106110145761010080835404028352916020019161103f565b820191906000526020600020905b81548152906001019060200180831161102257829003601f168201915b505050505081565b6000609954421061106a5760405162461bcd60e51b81526004016104ca90611f26565b6000611074610c12565b116110915760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a510008210156110b65760405162461bcd60e51b81526004016104ca90612046565b6110be610c12565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561110c57600080fd5b505afa158015611120573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611144919061207d565b61114e9084612096565b61115891906120b5565b905080609b54101561098e5760405162461bcd60e51b81526004016104ca906120d7565b6097546001600160a01b031633146111a65760405162461bcd60e51b81526004016104ca90611fd0565b6098546111bd906001600160a01b031682846117d4565b5050565b6001600160a01b03163b151590565b6040516001600160a01b038085166024830152831660448201526064810182905261123b9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118ee565b50505050565b6001600160a01b0382166112975760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104ca565b80603560008282546112a99190612007565b90915550506001600160a01b038216600090815260336020526040812080548392906112d6908490612007565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166113825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104ca565b6001600160a01b0382166113e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104ca565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006114508484610f4b565b9050600019811461123b57818110156114ab5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104ca565b61123b8484848403611320565b6001600160a01b03831661151c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104ca565b6001600160a01b03821661157e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104ca565b6001600160a01b038316600090815260336020526040902054818110156115f65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104ca565b6001600160a01b0380851660009081526033602052604080822085850390559185168152908120805484929061162d908490612007565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167991815260200190565b60405180910390a361123b565b6001600160a01b0382166116e65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104ca565b6001600160a01b0382166000908152603360205260409020548181101561175a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104ca565b6001600160a01b0383166000908152603360205260408120838303905560358054849290611789908490611f7e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b038316602482015260448101829052610fb490849063a9059cbb60e01b90606401611204565b60008054610100900460ff161561184b578160ff1660011480156118275750303b155b6118435760405162461bcd60e51b81526004016104ca9061211b565b506000919050565b60005460ff8084169116106118725760405162461bcd60e51b81526004016104ca9061211b565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff166118b35760405162461bcd60e51b81526004016104ca90612169565b6111bd82826119c0565b600054610100900460ff166118e45760405162461bcd60e51b81526004016104ca90612169565b6118ec611a0e565b565b6000611943826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a3c9092919063ffffffff16565b805190915015610fb4578080602001905181019061196191906121b4565b610fb45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104ca565b600054610100900460ff166119e75760405162461bcd60e51b81526004016104ca90612169565b81516119fa906036906020850190611bbd565b508051610fb4906037906020840190611bbd565b600054610100900460ff16611a355760405162461bcd60e51b81526004016104ca90612169565b6001606555565b6060611a4b8484600085611a53565b949350505050565b606082471015611ab45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104ca565b6001600160a01b0385163b611b0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104ca565b600080866001600160a01b03168587604051611b2791906121d6565b60006040518083038185875af1925050503d8060008114611b64576040519150601f19603f3d011682016040523d82523d6000602084013e611b69565b606091505b5091509150611b79828286611b84565b979650505050505050565b60608315611b935750816106ad565b825115611ba35782518084602001fd5b8160405162461bcd60e51b81526004016104ca9190611c82565b828054611bc990611f95565b90600052602060002090601f016020900481019282611beb5760008555611c31565b82601f10611c0457805160ff1916838001178555611c31565b82800160010185558215611c31579182015b82811115611c31578251825591602001919060010190611c16565b50611c3d929150611c41565b5090565b5b80821115611c3d5760008155600101611c42565b60005b83811015611c71578181015183820152602001611c59565b8381111561123b5750506000910152565b6020815260008251806020840152611ca1816040850160208701611c56565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610f4857600080fd5b60008060408385031215611cdd57600080fd5b8235611ce881611cb5565b946020939093013593505050565b600060208284031215611d0857600080fd5b5035919050565b600080600060608486031215611d2457600080fd5b8335611d2f81611cb5565b92506020840135611d3f81611cb5565b929592945050506040919091013590565b600060208284031215611d6257600080fd5b81356106ad81611cb5565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d9457600080fd5b813567ffffffffffffffff80821115611daf57611daf611d6d565b604051601f8301601f19908116603f01168101908282118183101715611dd757611dd7611d6d565b81604052838152866020858801011115611df057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c08789031215611e2957600080fd5b863567ffffffffffffffff80821115611e4157600080fd5b611e4d8a838b01611d83565b97506020890135915080821115611e6357600080fd5b611e6f8a838b01611d83565b96506040890135915080821115611e8557600080fd5b50611e9289828a01611d83565b9450506060870135611ea381611cb5565b92506080870135611eb381611cb5565b8092505060a087013590509295509295509295565b60008060408385031215611edb57600080fd5b8235611ee681611cb5565b91506020830135611ef681611cb5565b809150509250929050565b60008060408385031215611f1457600080fd5b823591506020830135611ef681611cb5565b60208082526022908201527f446973636f756e74426f6e643a204d5553545f4245464f52455f4d4154555249604082015261545960f01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611f9057611f90611f68565b500390565b600181811c90821680611fa957607f821691505b60208210811415611fca57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f446973636f756e74426f6e643a20554e415554484f52495a4544000000000000604082015260600190565b6000821982111561201a5761201a611f68565b500190565b6020808252600d908201526c494e56414c49445f505249434560981b604082015260600190565b6020808252601c908201527f446973636f756e74426f6e643a20414d4f554e545f544f4f5f4c4f5700000000604082015260600190565b60006020828403121561208f57600080fd5b5051919050565b60008160001904831182151516156120b0576120b0611f68565b500290565b6000826120d257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f446973636f756e74426f6e643a20494e53554646494349454e545f4c495155496040820152634449545960e01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156121c657600080fd5b815180151581146106ad57600080fd5b600082516121e8818460208701611c56565b919091019291505056fea26469706673582212200271260375176e7f9e8b338e9e48b6eaa2d859cdce139e2cd0ea55af762055b064736f6c63430008090033", + "devdoc": { + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "grant(uint256)": { + "details": "grant specific amount of bond for user mint." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 6, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 9, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 1533, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 330, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "_balances", + "offset": 0, + "slot": "51", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 336, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "_allowances", + "offset": 0, + "slot": "52", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 338, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "_totalSupply", + "offset": 0, + "slot": "53", + "type": "t_uint256" + }, + { + "astId": 340, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "_name", + "offset": 0, + "slot": "54", + "type": "t_string_storage" + }, + { + "astId": 342, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "_symbol", + "offset": 0, + "slot": "55", + "type": "t_string_storage" + }, + { + "astId": 921, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "__gap", + "offset": 0, + "slot": "56", + "type": "t_array(t_uint256)45_storage" + }, + { + "astId": 266, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "_status", + "offset": 0, + "slot": "101", + "type": "t_uint256" + }, + { + "astId": 310, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 3097, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "factory", + "offset": 0, + "slot": "151", + "type": "t_contract(IBondFactory)3756" + }, + { + "astId": 3100, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "underlyingToken", + "offset": 0, + "slot": "152", + "type": "t_contract(IERC20Upgradeable)1000" + }, + { + "astId": 3102, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "maturity", + "offset": 0, + "slot": "153", + "type": "t_uint256" + }, + { + "astId": 3104, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "series", + "offset": 0, + "slot": "154", + "type": "t_string_storage" + }, + { + "astId": 3106, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "inventoryAmount", + "offset": 0, + "slot": "155", + "type": "t_uint256" + }, + { + "astId": 3108, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "redeemedAmount", + "offset": 0, + "slot": "156", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)45_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[45]", + "numberOfBytes": "1440" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(IBondFactory)3756": { + "encoding": "inplace", + "label": "contract IBondFactory", + "numberOfBytes": "20" + }, + "t_contract(IERC20Upgradeable)1000": { + "encoding": "inplace", + "label": "contract IERC20Upgradeable", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/DuetTransparentUpgradeableProxy.json b/packages/bonds/deployments/bsctest/DuetTransparentUpgradeableProxy.json new file mode 100644 index 0000000..d6e8364 --- /dev/null +++ b/packages/bonds/deployments/bsctest/DuetTransparentUpgradeableProxy.json @@ -0,0 +1,231 @@ +{ + "address": "0xbae34AC084337588D4972b92a143C547c5Fd96C9", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "changeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + } + ], + "name": "upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "upgradeToAndCall", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0x448df6a345ef4bca8c54cd033efe28782af0c6b9d2576224c2798a576dbd2a2e", + "receipt": { + "to": null, + "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "contractAddress": "0xbae34AC084337588D4972b92a143C547c5Fd96C9", + "transactionIndex": 2, + "gasUsed": "557620", + "logsBloom": "0x00000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000200000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000020000000000000800000000000000000000000000000000000000000000000000000000000000000000000008020008001000000000000000000000000000400000000000000000000000000000000000000000000000000000000000020000000000000000000000000", + "blockHash": "0x947e34f4f1f032ed8c5e4fd8f12eb6d76acbbfa14310d73646cb9fbbe59b0286", + "transactionHash": "0x448df6a345ef4bca8c54cd033efe28782af0c6b9d2576224c2798a576dbd2a2e", + "logs": [ + { + "transactionIndex": 2, + "blockNumber": 24220099, + "transactionHash": "0x448df6a345ef4bca8c54cd033efe28782af0c6b9d2576224c2798a576dbd2a2e", + "address": "0xbae34AC084337588D4972b92a143C547c5Fd96C9", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x0000000000000000000000004f90c9d2ddb4d3569294a6011c87d06f66e277dc" + ], + "data": "0x", + "logIndex": 3, + "blockHash": "0x947e34f4f1f032ed8c5e4fd8f12eb6d76acbbfa14310d73646cb9fbbe59b0286" + }, + { + "transactionIndex": 2, + "blockNumber": 24220099, + "transactionHash": "0x448df6a345ef4bca8c54cd033efe28782af0c6b9d2576224c2798a576dbd2a2e", + "address": "0xbae34AC084337588D4972b92a143C547c5Fd96C9", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004f90c9d2ddb4d3569294a6011c87d06f66e277dc", + "logIndex": 4, + "blockHash": "0x947e34f4f1f032ed8c5e4fd8f12eb6d76acbbfa14310d73646cb9fbbe59b0286" + } + ], + "blockNumber": 24220099, + "cumulativeGasUsed": "655369", + "status": 1, + "byzantium": true + }, + "args": [ + "0x4F90C9D2ddb4D3569294A6011C87D06F66E277Dc", + "0x4F90C9D2ddb4D3569294A6011C87D06F66E277Dc", + "0x" + ], + "numDeployments": 2, + "solcInputHash": "8ad23f9bb37bd1e3765ac943d46d8a69", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"admin()\":{\"details\":\"Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\"},\"changeAdmin(address)\":{\"details\":\"Changes the admin of the proxy. Emits an {AdminChanged} event. NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\"},\"implementation()\":{\"details\":\"Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libs/DuetTransparentUpgradeableProxy.sol\":\"DuetTransparentUpgradeableProxy\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC1967/ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\\n * clashing], which can potentially be used in an attack, this contract uses the\\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\\n * things that go hand in hand:\\n *\\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\\n * that call matches one of the admin functions exposed by the proxy itself.\\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\\n * \\\"admin cannot fallback to proxy target\\\".\\n *\\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\\n * to sudden errors when trying to call a function from the proxy implementation.\\n *\\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n /**\\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\\n */\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable ERC1967Proxy(_logic, _data) {\\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1));\\n _changeAdmin(admin_);\\n }\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function admin() external ifAdmin returns (address admin_) {\\n admin_ = _getAdmin();\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function implementation() external ifAdmin returns (address implementation_) {\\n implementation_ = _implementation();\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\\n */\\n function changeAdmin(address newAdmin) external virtual ifAdmin {\\n _changeAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\\n */\\n function upgradeTo(address newImplementation) external ifAdmin {\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\\n */\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\\n _upgradeToAndCall(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\\n */\\n function _beforeFallback() internal virtual override {\\n require(msg.sender != _getAdmin(), \\\"TransparentUpgradeableProxy: admin cannot fallback to proxy target\\\");\\n super._beforeFallback();\\n }\\n}\\n\",\"keccak256\":\"0x140055a64cf579d622e04f5a198595832bf2cb193cd0005f4f2d4d61ca906253\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2ccf9d2313a313d41a791505f2b5abfdc62191b5d4334f7f7a82691c088a1c87\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"},\"contracts/libs/DuetTransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\nimport \\\"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\\\";\\n\\ncontract DuetTransparentUpgradeableProxy is TransparentUpgradeableProxy {\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {}\\n\\n /**\\n * @dev override parent behavior to manage bonds fully in Factory\\n *\\n */\\n function _beforeFallback() internal virtual override {}\\n}\\n\",\"keccak256\":\"0xe59f85b113777531c6519e0cd2bedbc35844ca809a153b10a9f17840042978b1\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x608060405260405162000eca38038062000eca83398101604081905262000026916200051f565b82828282816200005860017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd620005ff565b60008051602062000e838339815191521462000078576200007862000625565b6200008682826000620000ed565b50620000b6905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005ff565b60008051602062000e6383398151915214620000d657620000d662000625565b620000e1826200012a565b5050505050506200068e565b620000f88362000185565b600082511180620001065750805b156200012557620001238383620001c760201b620002581760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000155620001f6565b604080516001600160a01b03928316815291841660208301520160405180910390a162000182816200022f565b50565b6200019081620002e4565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060620001ef838360405180606001604052806027815260200162000ea36027913962000387565b9392505050565b60006200022060008051602062000e6383398151915260001b6200046d60201b620002001760201c565b546001600160a01b0316919050565b6001600160a01b0381166200029a5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002c360008051602062000e6383398151915260001b6200046d60201b620002001760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002fa816200047060201b620002841760201c565b6200035e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000291565b80620002c360008051602062000e8383398151915260001b6200046d60201b620002001760201c565b60606001600160a01b0384163b620003f15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840162000291565b600080856001600160a01b0316856040516200040e91906200063b565b600060405180830381855af49150503d80600081146200044b576040519150601f19603f3d011682016040523d82523d6000602084013e62000450565b606091505b509092509050620004638282866200047f565b9695505050505050565b90565b6001600160a01b03163b151590565b6060831562000490575081620001ef565b825115620004a15782518084602001fd5b8160405162461bcd60e51b815260040162000291919062000659565b80516001600160a01b0381168114620004d557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200050d578181015183820152602001620004f3565b83811115620001235750506000910152565b6000806000606084860312156200053557600080fd5b6200054084620004bd565b92506200055060208501620004bd565b60408501519092506001600160401b03808211156200056e57600080fd5b818601915086601f8301126200058357600080fd5b815181811115620005985762000598620004da565b604051601f8201601f19908116603f01168101908382118183101715620005c357620005c3620004da565b81604052828152896020848701011115620005dd57600080fd5b620005f0836020830160208801620004f0565b80955050505050509250925092565b6000828210156200062057634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b600082516200064f818460208701620004f0565b9190910192915050565b60208152600082518060208401526200067a816040850160208701620004f0565b601f01601f19169190910160400192915050565b6107c5806200069e6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b61008036600461064f565b610110565b61005b61009336600461066a565b610157565b3480156100a457600080fd5b506100ad6101c8565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e436600461064f565b610203565b3480156100f557600080fd5b506100ad61022d565b61010e610109610293565b61029d565b565b6101186102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c816040518060200160405280600081525060006102f4565b50565b61014c6100fe565b61015f6102c1565b6001600160a01b0316336001600160a01b031614156101c0576101bb8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506102f4915050565b505050565b6101bb6100fe565b60006101d26102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f3610293565b905090565b6102006100fe565b90565b61020b6102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c8161031f565b60006102376102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f36102c1565b606061027d838360405180606001604052806027815260200161076960279139610373565b9392505050565b6001600160a01b03163b151590565b60006101f3610455565b3660008037600080366000845af43d6000803e8080156102bc573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6102fd8361047d565b60008251118061030a5750805b156101bb576103198383610258565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103486102c1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014c816104bd565b60606001600160a01b0384163b6103e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516103fb9190610719565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044b828286610566565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102e5565b6104868161059f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105225760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d7565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561057557508161027d565b8251156105855782518084602001fd5b8160405162461bcd60e51b81526004016103d79190610735565b6001600160a01b0381163b61060c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016103d7565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610545565b80356001600160a01b038116811461064a57600080fd5b919050565b60006020828403121561066157600080fd5b61027d82610633565b60008060006040848603121561067f57600080fd5b61068884610633565b9250602084013567ffffffffffffffff808211156106a557600080fd5b818601915086601f8301126106b957600080fd5b8135818111156106c857600080fd5b8760208285010111156106da57600080fd5b6020830194508093505050509250925092565b60005b838110156107085781810151838201526020016106f0565b838111156103195750506000910152565b6000825161072b8184602087016106ed565b9190910192915050565b60208152600082518060208401526107548160408501602087016106ed565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9e1fbe41895f8bf7249337aca83abf16214aebbd0a1f744a3df3f57c9c8a4e264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b61008036600461064f565b610110565b61005b61009336600461066a565b610157565b3480156100a457600080fd5b506100ad6101c8565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e436600461064f565b610203565b3480156100f557600080fd5b506100ad61022d565b61010e610109610293565b61029d565b565b6101186102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c816040518060200160405280600081525060006102f4565b50565b61014c6100fe565b61015f6102c1565b6001600160a01b0316336001600160a01b031614156101c0576101bb8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506102f4915050565b505050565b6101bb6100fe565b60006101d26102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f3610293565b905090565b6102006100fe565b90565b61020b6102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c8161031f565b60006102376102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f36102c1565b606061027d838360405180606001604052806027815260200161076960279139610373565b9392505050565b6001600160a01b03163b151590565b60006101f3610455565b3660008037600080366000845af43d6000803e8080156102bc573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6102fd8361047d565b60008251118061030a5750805b156101bb576103198383610258565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103486102c1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014c816104bd565b60606001600160a01b0384163b6103e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516103fb9190610719565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044b828286610566565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102e5565b6104868161059f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105225760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d7565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561057557508161027d565b8251156105855782518084602001fd5b8160405162461bcd60e51b81526004016103d79190610735565b6001600160a01b0381163b61060c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016103d7565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610545565b80356001600160a01b038116811461064a57600080fd5b919050565b60006020828403121561066157600080fd5b61027d82610633565b60008060006040848603121561067f57600080fd5b61068884610633565b9250602084013567ffffffffffffffff808211156106a557600080fd5b818601915086601f8301126106b957600080fd5b8135818111156106c857600080fd5b8760208285010111156106da57600080fd5b6020830194508093505050509250925092565b60005b838110156107085781810151838201526020016106f0565b838111156103195750506000910152565b6000825161072b8184602087016106ed565b9190910192915050565b60208152600082518060208401526107548160408501602087016106ed565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9e1fbe41895f8bf7249337aca83abf16214aebbd0a1f744a3df3f57c9c8a4e264736f6c63430008090033", + "devdoc": { + "kind": "dev", + "methods": { + "admin()": { + "details": "Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`" + }, + "changeAdmin(address)": { + "details": "Changes the admin of the proxy. Emits an {AdminChanged} event. NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}." + }, + "implementation()": { + "details": "Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`" + }, + "upgradeTo(address)": { + "details": "Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}." + }, + "upgradeToAndCall(address,bytes)": { + "details": "Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/solcInputs/21f9402e2ca5f3597c1386289d997b81.json b/packages/bonds/deployments/bsctest/solcInputs/21f9402e2ca5f3597c1386289d997b81.json new file mode 100644 index 0000000..f9b15b2 --- /dev/null +++ b/packages/bonds/deployments/bsctest/solcInputs/21f9402e2ca5f3597c1386289d997b81.json @@ -0,0 +1,106 @@ +{ + "language": "Solidity", + "sources": { + "contracts/BondFactory.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nimport \"./interfaces/IBondFactory.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./libs/Adminable.sol\";\nimport \"./libs/DuetTransparentUpgradeableProxy.sol\";\n\ncontract BondFactory is IBondFactory, Initializable, Adminable {\n /**\n * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%;\n * Calculation formula: x * percentage / PERCENTAGE_FACTOR\n */\n uint16 public constant PERCENTAGE_FACTOR = 10000;\n // kind => impl\n mapping(string => address) public bondImplementations;\n // kind => bond addresses\n mapping(string => address[]) public kindBondsMapping;\n // series => bond addresses\n mapping(string => address[]) public seriesBondsMapping;\n string[] public bondKinds;\n string[] public bondSeries;\n\n // bond => price\n mapping(address => uint256) public bondPrices;\n\n event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice);\n event BondImplementationUpdated(string kind, address implementation, address previousImplementation);\n event BondCreated(address bondToken);\n event BondRemoved(address bondToken);\n\n constructor() initializer {}\n\n function initialize(address admin_) public initializer {\n _setAdmin(admin_);\n }\n\n function createBond(\n string memory kind_,\n string memory name_,\n string memory symbol_,\n uint256 initialPrice_,\n uint256 initialGrant_,\n string memory series_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external onlyAdmin returns (address bondTokenAddress) {\n address proxyAdmin = address(this);\n address bondImpl = bondImplementations[kind_];\n require(bondImpl != address(0), \"BondFactory: Invalid bond implementation\");\n require(initialPrice_ > 0, \"BondFactory: INVALID_PRICE\");\n bytes memory proxyData;\n DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData);\n bondTokenAddress = address(proxy);\n IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_);\n if (seriesBondsMapping[series_].length == 0) {\n bondSeries.push(series_);\n }\n setPrice(bondTokenAddress, initialPrice_);\n if (initialGrant_ > 0) {\n grant(bondTokenAddress, initialGrant_);\n }\n seriesBondsMapping[series_].push(bondTokenAddress);\n kindBondsMapping[kind_].push(bondTokenAddress);\n emit BondCreated(bondTokenAddress);\n }\n\n function getBondKinds() external view returns (string[] memory) {\n return bondKinds;\n }\n\n function getKindBondLength(string memory kind_) external view returns (uint256) {\n return kindBondsMapping[kind_].length;\n }\n\n function getBondSeries() external view returns (string[] memory) {\n return bondSeries;\n }\n\n function getSeriesBondLength(string memory series_) external view returns (uint256) {\n return seriesBondsMapping[series_].length;\n }\n\n function setBondImplementation(\n string calldata kind_,\n address impl_,\n bool upgradeDeployed_\n ) external onlyAdmin {\n if (bondImplementations[kind_] == address(0)) {\n bondKinds.push(kind_);\n }\n emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]);\n bondImplementations[kind_] = impl_;\n if (!upgradeDeployed_) {\n return;\n }\n for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) {\n DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_);\n }\n }\n\n function setPrice(address bondToken_, uint256 price) public onlyAdmin {\n emit PriceUpdated(bondToken_, price, bondPrices[bondToken_]);\n bondPrices[bondToken_] = price;\n }\n\n function getPrice(address bondToken_) public view returns (uint256) {\n return bondPrices[bondToken_];\n }\n\n function priceDecimals() public view returns (uint256) {\n return 8;\n }\n\n function priceFactor() public view returns (uint256) {\n return 10**priceDecimals();\n }\n\n function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin {\n IBond(bondToken_).underlyingOut(amount_, msg.sender);\n }\n\n function grant(address bondToken_, uint256 amount_) public onlyAdmin {\n IBond(bondToken_).grant(amount_);\n }\n\n function removeBond(IBond bondToken_) external onlyAdmin {\n require(bondToken_.totalSupply() <= 0, \"BondFactory: CANT_REMOVE\");\n string memory kind = bondToken_.kind();\n string memory series = bondToken_.series();\n address bondTokenAddress = address(bondToken_);\n\n uint256 kindBondLength = kindBondsMapping[kind].length;\n for (uint256 i = 0; i < kindBondLength; i++) {\n if (kindBondsMapping[kind][i] != bondTokenAddress) {\n continue;\n }\n kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1];\n kindBondsMapping[kind].pop();\n }\n\n uint256 seriesBondLength = seriesBondsMapping[series].length;\n for (uint256 j = 0; j < seriesBondLength; j++) {\n if (seriesBondsMapping[series][j] != bondTokenAddress) {\n continue;\n }\n seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1];\n seriesBondsMapping[series].pop();\n }\n\n emit BondRemoved(bondTokenAddress);\n }\n\n function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) {\n // TODO\n return 0;\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n */\n modifier initializer() {\n bool isTopLevelCall = _setInitializedVersion(1);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n * initialization step. This is essential to configure modules that are added through upgrades and that require\n * initialization.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n */\n modifier reinitializer(uint8 version) {\n bool isTopLevelCall = _setInitializedVersion(version);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(version);\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n */\n function _disableInitializers() internal virtual {\n _setInitializedVersion(type(uint8).max);\n }\n\n function _setInitializedVersion(uint8 version) private returns (bool) {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\n // of initializers, because in other contexts the contract may have been reentered.\n if (_initializing) {\n require(\n version == 1 && !AddressUpgradeable.isContract(address(this)),\n \"Initializable: contract is already initialized\"\n );\n return false;\n } else {\n require(_initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n return true;\n }\n }\n}\n" + }, + "contracts/interfaces/IBondFactory.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\ninterface IBondFactory {\n function priceFactor() external view returns (uint256);\n\n function getPrice(address bondToken_) external view returns (uint256 price);\n}\n" + }, + "contracts/interfaces/IBond.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface IBond is IERC20Upgradeable {\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external;\n\n function kind() external returns (string memory);\n\n function series() external returns (string memory);\n\n function underlyingOut(uint256 amount_, address to_) external;\n\n function grant(uint256 amount_) external;\n\n function faceValue(uint256 bondAmount_) external view returns (uint256);\n\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\n}\n" + }, + "contracts/libs/Adminable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nabstract contract Adminable {\n event AdminUpdated(address indexed user, address indexed newAdmin);\n\n address public admin;\n\n modifier onlyAdmin() virtual {\n require(msg.sender == admin, \"UNAUTHORIZED\");\n\n _;\n }\n\n function setAdmin(address newAdmin) public virtual onlyAdmin {\n _setAdmin(newAdmin);\n }\n\n function _setAdmin(address newAdmin) internal {\n require(newAdmin != address(0), \"Can not set admin to zero address\");\n admin = newAdmin;\n\n emit AdminUpdated(msg.sender, newAdmin);\n }\n}\n" + }, + "contracts/libs/DuetTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\nimport \"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\";\n\ncontract DuetTransparentUpgradeableProxy is TransparentUpgradeableProxy {\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {}\n\n /**\n * @dev override parent behavior to manage bonds fully in Factory\n *\n */\n function _beforeFallback() internal virtual override {}\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _changeAdmin(admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\n */\n function changeAdmin(address newAdmin) external virtual ifAdmin {\n _changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1));\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overridden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n Address.isContract(IBeacon(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n" + }, + "@openzeppelin/contracts/interfaces/draft-IERC1822.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n}\n" + }, + "contracts/DiscountBond.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\n\nimport \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./interfaces/IBondFactory.sol\";\n\ncontract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n string public constant kind = \"Discount\";\n uint256 public constant MIN_TRADING_AMOUNT = 1e12;\n\n IBondFactory public factory;\n IERC20Upgradeable public underlyingToken;\n uint256 public maturity;\n string public series;\n uint256 public inventoryAmount;\n uint256 public redeemedAmount;\n\n event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondRedeemed(address indexed account, uint256 amount);\n event BondGranted(uint256 amount, uint256 inventoryAmount);\n\n constructor() initializer {}\n\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series_,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external initializer {\n __ERC20_init(name_, symbol_);\n __ReentrancyGuard_init();\n require(\n maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days),\n \"DiscountBond: INVALID_MATURITY\"\n );\n series = series_;\n underlyingToken = underlyingToken_;\n factory = IBondFactory(factory_);\n maturity = maturity_;\n }\n\n modifier beforeMaturity() {\n require(block.timestamp < maturity, \"DiscountBond: MUST_BEFORE_MATURITY\");\n _;\n }\n\n modifier afterMaturity() {\n require(block.timestamp >= maturity, \"DiscountBond: MUST_AFTER_MATURITY\");\n _;\n }\n\n modifier tradingGuard() {\n require(getPrice() > 0, \"INVALID_PRICE\");\n _;\n }\n\n modifier onlyFactory() {\n require(msg.sender == address(factory), \"DiscountBond: UNAUTHORIZED\");\n _;\n }\n\n /**\n * @dev grant specific amount of bond for user mint.\n */\n function grant(uint256 amount_) external onlyFactory {\n inventoryAmount += amount_;\n emit BondGranted(amount_, inventoryAmount);\n }\n\n function getPrice() public view returns (uint256) {\n return factory.getPrice(address(this));\n }\n\n function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_)\n external\n beforeMaturity\n returns (uint256 bondAmount)\n {\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_);\n bondAmount = previewMintByUnderlyingAmount(underlyingAmount_);\n inventoryAmount -= bondAmount;\n _mint(account_, bondAmount);\n emit BondMinted(account_, bondAmount, underlyingAmount_);\n }\n\n function previewMintByUnderlyingAmount(uint256 underlyingAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 bondAmount)\n {\n require(underlyingAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice();\n require(inventoryAmount >= bondAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function mintByBondAmount(address account_, uint256 bondAmount_)\n external\n beforeMaturity\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewMintByBondAmount(bondAmount_);\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount);\n inventoryAmount -= bondAmount_;\n _mint(account_, bondAmount_);\n emit BondMinted(account_, bondAmount_, underlyingAmount);\n }\n\n function previewMintByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(inventoryAmount >= bondAmount_, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n }\n\n function sellByBondAmount(uint256 bondAmount_)\n public\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewSellByBondAmount(bondAmount_);\n _burn(msg.sender, bondAmount_);\n inventoryAmount += bondAmount_;\n underlyingToken.safeTransfer(msg.sender, underlyingAmount);\n emit BondSold(msg.sender, bondAmount_, underlyingAmount);\n }\n\n function previewSellByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function redeem(uint256 bondAmount_) public {\n redeemFor(msg.sender, bondAmount_);\n }\n\n function faceValue(uint256 bondAmount_) public view returns (uint256) {\n return bondAmount_;\n }\n\n function amountToUnderlying(uint256 bondAmount_) public view returns (uint256) {\n if (block.timestamp >= maturity) {\n return faceValue(bondAmount_);\n }\n return (bondAmount_ * getPrice()) / factory.priceFactor();\n }\n\n function redeemFor(address account_, uint256 bondAmount_) public afterMaturity {\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n _burn(msg.sender, bondAmount_);\n redeemedAmount += bondAmount_;\n underlyingToken.safeTransfer(account_, bondAmount_);\n emit BondRedeemed(account_, bondAmount_);\n }\n\n /**\n * @notice\n */\n function underlyingOut(uint256 amount_, address to_) external onlyFactory {\n underlyingToken.safeTransfer(to_, amount_);\n }\n\n function emergencyWithdraw(\n IERC20Upgradeable token_,\n address to_,\n uint256 amount_\n ) external onlyFactory {\n token_.safeTransfer(to_, amount_);\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n function safeTransfer(\n IERC20Upgradeable token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20Upgradeable token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Upgradeable.sol\";\nimport \"./extensions/IERC20MetadataUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\n __ERC20_init_unchained(name_, symbol_);\n }\n\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[45] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal onlyInitializing {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "libraries": { + "": { + "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/solcInputs/86b5d7bad88174195e885f97b1fed94c.json b/packages/bonds/deployments/bsctest/solcInputs/86b5d7bad88174195e885f97b1fed94c.json new file mode 100644 index 0000000..b657850 --- /dev/null +++ b/packages/bonds/deployments/bsctest/solcInputs/86b5d7bad88174195e885f97b1fed94c.json @@ -0,0 +1,106 @@ +{ + "language": "Solidity", + "sources": { + "contracts/BondFactory.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nimport \"./interfaces/IBondFactory.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./libs/Adminable.sol\";\nimport \"./libs/DuetTransparentUpgradeableProxy.sol\";\n\ncontract BondFactory is IBondFactory, Initializable, Adminable {\n /**\n * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%;\n * Calculation formula: x * percentage / PERCENTAGE_FACTOR\n */\n uint16 public constant PERCENTAGE_FACTOR = 10000;\n // kind => impl\n mapping(string => address) public bondImplementations;\n // kind => bond addresses\n mapping(string => address[]) public kindBondsMapping;\n // series => bond addresses\n mapping(string => address[]) public seriesBondsMapping;\n string[] public bondKinds;\n string[] public bondSeries;\n\n // bond => price\n mapping(address => uint256) public bondPrices;\n\n event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice);\n event BondImplementationUpdated(string kind, address implementation, address previousImplementation);\n event BondCreated(address bondToken);\n event BondRemoved(address bondToken);\n\n constructor() initializer {}\n\n function initialize(address admin_) public initializer {\n _setAdmin(admin_);\n }\n\n function createBond(\n string memory kind_,\n string memory name_,\n string memory symbol_,\n uint256 initialPrice_,\n string memory series_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external onlyAdmin returns (address bondTokenAddress) {\n address proxyAdmin = address(this);\n address bondImpl = bondImplementations[kind_];\n require(bondImpl != address(0), \"BondFactory: Invalid bond implementation\");\n require(initialPrice_ > 0, \"BondFactory: INVALID_PRICE\");\n bytes memory proxyData;\n DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData);\n bondTokenAddress = address(proxy);\n IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_);\n if (seriesBondsMapping[series_].length == 0) {\n bondSeries.push(series_);\n }\n setPrice(bondTokenAddress, initialPrice_);\n seriesBondsMapping[series_].push(bondTokenAddress);\n kindBondsMapping[kind_].push(bondTokenAddress);\n emit BondCreated(bondTokenAddress);\n }\n\n function getBondKinds() external view returns (string[] memory) {\n return bondKinds;\n }\n\n function getKindBondLength(string memory kind_) external view returns (uint256) {\n return kindBondsMapping[kind_].length;\n }\n\n function getBondSeries() external view returns (string[] memory) {\n return bondSeries;\n }\n\n function getSeriesBondLength(string memory series_) external view returns (uint256) {\n return seriesBondsMapping[series_].length;\n }\n\n function setBondImplementation(\n string calldata kind_,\n address impl_,\n bool upgradeDeployed_\n ) external onlyAdmin {\n if (bondImplementations[kind_] == address(0)) {\n bondKinds.push(kind_);\n }\n emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]);\n bondImplementations[kind_] = impl_;\n if (!upgradeDeployed_) {\n return;\n }\n for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) {\n DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_);\n }\n }\n\n function setPrice(address bondToken_, uint256 price) public onlyAdmin {\n emit PriceUpdated(bondToken_, price, bondPrices[bondToken_]);\n bondPrices[bondToken_] = price;\n }\n\n function getPrice(address bondToken_) public view returns (uint256) {\n return bondPrices[bondToken_];\n }\n\n function priceDecimals() public view returns (uint256) {\n return 8;\n }\n\n function priceFactor() public view returns (uint256) {\n return 10**priceDecimals();\n }\n\n function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin {\n IBond(bondToken_).underlyingOut(amount_, msg.sender);\n }\n\n function grant(address bondToken_, uint256 amount_) external onlyAdmin {\n IBond(bondToken_).grant(amount_);\n }\n\n function removeBond(IBond bondToken_) external onlyAdmin {\n require(bondToken_.totalSupply() <= 0, \"BondFactory: CANT_REMOVE\");\n string memory kind = bondToken_.kind();\n string memory series = bondToken_.series();\n address bondTokenAddress = address(bondToken_);\n\n uint256 kindBondLength = kindBondsMapping[kind].length;\n for (uint256 i = 0; i < kindBondLength; i++) {\n if (kindBondsMapping[kind][i] != bondTokenAddress) {\n continue;\n }\n kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1];\n kindBondsMapping[kind].pop();\n }\n\n uint256 seriesBondLength = seriesBondsMapping[series].length;\n for (uint256 j = 0; j < seriesBondLength; j++) {\n if (seriesBondsMapping[series][j] != bondTokenAddress) {\n continue;\n }\n seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1];\n seriesBondsMapping[series].pop();\n }\n\n emit BondRemoved(bondTokenAddress);\n }\n\n function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) {\n // TODO\n return 0;\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n */\n modifier initializer() {\n bool isTopLevelCall = _setInitializedVersion(1);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n * initialization step. This is essential to configure modules that are added through upgrades and that require\n * initialization.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n */\n modifier reinitializer(uint8 version) {\n bool isTopLevelCall = _setInitializedVersion(version);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(version);\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n */\n function _disableInitializers() internal virtual {\n _setInitializedVersion(type(uint8).max);\n }\n\n function _setInitializedVersion(uint8 version) private returns (bool) {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\n // of initializers, because in other contexts the contract may have been reentered.\n if (_initializing) {\n require(\n version == 1 && !AddressUpgradeable.isContract(address(this)),\n \"Initializable: contract is already initialized\"\n );\n return false;\n } else {\n require(_initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n return true;\n }\n }\n}\n" + }, + "contracts/interfaces/IBondFactory.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\ninterface IBondFactory {\n function priceFactor() external view returns (uint256);\n\n function getPrice(address bondToken_) external view returns (uint256 price);\n}\n" + }, + "contracts/interfaces/IBond.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface IBond is IERC20Upgradeable {\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external;\n\n function kind() external returns (string memory);\n\n function series() external returns (string memory);\n\n function underlyingOut(uint256 amount_, address to_) external;\n\n function grant(uint256 amount_) external;\n\n function faceValue(uint256 bondAmount_) external view returns (uint256);\n\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\n}\n" + }, + "contracts/libs/Adminable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nabstract contract Adminable {\n event AdminUpdated(address indexed user, address indexed newAdmin);\n\n address public admin;\n\n modifier onlyAdmin() virtual {\n require(msg.sender == admin, \"UNAUTHORIZED\");\n\n _;\n }\n\n function setAdmin(address newAdmin) public virtual onlyAdmin {\n _setAdmin(newAdmin);\n }\n\n function _setAdmin(address newAdmin) internal {\n require(newAdmin != address(0), \"Can not set admin to zero address\");\n admin = newAdmin;\n\n emit AdminUpdated(msg.sender, newAdmin);\n }\n}\n" + }, + "contracts/libs/DuetTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\nimport \"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\";\n\ncontract DuetTransparentUpgradeableProxy is TransparentUpgradeableProxy {\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {}\n\n /**\n * @dev override parent behavior to manage bonds fully in Factory\n *\n */\n function _beforeFallback() internal virtual override {}\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _changeAdmin(admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\n */\n function changeAdmin(address newAdmin) external virtual ifAdmin {\n _changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1));\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overridden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n Address.isContract(IBeacon(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n" + }, + "@openzeppelin/contracts/interfaces/draft-IERC1822.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n}\n" + }, + "contracts/DiscountBond.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\n\nimport \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./interfaces/IBondFactory.sol\";\n\ncontract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n string public constant kind = \"Discount\";\n uint256 public constant MIN_TRADING_AMOUNT = 1e12;\n\n IBondFactory public factory;\n IERC20Upgradeable public underlyingToken;\n uint256 public maturity;\n string public series;\n uint256 public inventoryAmount;\n uint256 public redeemedAmount;\n\n event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondRedeemed(address indexed account, uint256 amount);\n event BondGranted(uint256 amount, uint256 inventoryAmount);\n\n constructor() initializer {}\n\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series_,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external initializer {\n __ERC20_init(name_, symbol_);\n __ReentrancyGuard_init();\n require(\n maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days),\n \"DiscountBond: INVALID_MATURITY\"\n );\n series = series_;\n underlyingToken = underlyingToken_;\n factory = IBondFactory(factory_);\n maturity = maturity_;\n }\n\n modifier beforeMaturity() {\n require(block.timestamp < maturity, \"DiscountBond: MUST_BEFORE_MATURITY\");\n _;\n }\n\n modifier afterMaturity() {\n require(block.timestamp >= maturity, \"DiscountBond: MUST_AFTER_MATURITY\");\n _;\n }\n\n modifier tradingGuard() {\n require(getPrice() > 0, \"INVALID_PRICE\");\n _;\n }\n\n modifier onlyFactory() {\n require(msg.sender == address(factory), \"DiscountBond: UNAUTHORIZED\");\n _;\n }\n\n /**\n * @dev grant specific amount of bond for user mint.\n */\n function grant(uint256 amount_) external onlyFactory {\n inventoryAmount += amount_;\n emit BondGranted(amount_, inventoryAmount);\n }\n\n function getPrice() public view returns (uint256) {\n return factory.getPrice(address(this));\n }\n\n function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_)\n external\n beforeMaturity\n returns (uint256 bondAmount)\n {\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_);\n bondAmount = previewMintByUnderlyingAmount(underlyingAmount_);\n inventoryAmount -= bondAmount;\n _mint(account_, bondAmount);\n emit BondMinted(account_, bondAmount, underlyingAmount_);\n }\n\n function previewMintByUnderlyingAmount(uint256 underlyingAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 bondAmount)\n {\n require(underlyingAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice();\n require(inventoryAmount >= bondAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function mintByBondAmount(address account_, uint256 bondAmount_)\n external\n beforeMaturity\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewMintByBondAmount(bondAmount_);\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount);\n inventoryAmount -= bondAmount_;\n _mint(account_, bondAmount_);\n emit BondMinted(account_, bondAmount_, underlyingAmount);\n }\n\n function previewMintByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(inventoryAmount >= bondAmount_, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n }\n\n function sellByBondAmount(uint256 bondAmount_)\n public\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewSellByBondAmount(bondAmount_);\n _burn(msg.sender, bondAmount_);\n inventoryAmount += bondAmount_;\n underlyingToken.safeTransfer(msg.sender, underlyingAmount);\n emit BondSold(msg.sender, bondAmount_, underlyingAmount);\n }\n\n function previewSellByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function redeem(uint256 bondAmount_) public {\n redeemFor(msg.sender, bondAmount_);\n }\n\n function faceValue(uint256 bondAmount_) public view returns (uint256) {\n return bondAmount_;\n }\n\n function amountToUnderlying(uint256 bondAmount_) public view returns (uint256) {\n if (block.timestamp >= maturity) {\n return faceValue(bondAmount_);\n }\n return (bondAmount_ * getPrice()) / factory.priceFactor();\n }\n\n function redeemFor(address account_, uint256 bondAmount_) public afterMaturity {\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n _burn(msg.sender, bondAmount_);\n redeemedAmount += bondAmount_;\n underlyingToken.safeTransfer(account_, bondAmount_);\n emit BondRedeemed(account_, bondAmount_);\n }\n\n /**\n * @notice\n */\n function underlyingOut(uint256 amount_, address to_) external onlyFactory {\n underlyingToken.safeTransfer(to_, amount_);\n }\n\n function emergencyWithdraw(\n IERC20Upgradeable token_,\n address to_,\n uint256 amount_\n ) external onlyFactory {\n token_.safeTransfer(to_, amount_);\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n function safeTransfer(\n IERC20Upgradeable token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20Upgradeable token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Upgradeable.sol\";\nimport \"./extensions/IERC20MetadataUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\n __ERC20_init_unchained(name_, symbol_);\n }\n\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[45] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal onlyInitializing {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "libraries": { + "": { + "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/solcInputs/8ad23f9bb37bd1e3765ac943d46d8a69.json b/packages/bonds/deployments/bsctest/solcInputs/8ad23f9bb37bd1e3765ac943d46d8a69.json new file mode 100644 index 0000000..9058446 --- /dev/null +++ b/packages/bonds/deployments/bsctest/solcInputs/8ad23f9bb37bd1e3765ac943d46d8a69.json @@ -0,0 +1,106 @@ +{ + "language": "Solidity", + "sources": { + "contracts/BondFactory.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nimport \"./interfaces/IBondFactory.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./libs/Adminable.sol\";\nimport \"./libs/DuetTransparentUpgradeableProxy.sol\";\n\ncontract BondFactory is IBondFactory, Initializable, Adminable {\n /**\n * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%;\n * Calculation formula: x * percentage / PERCENTAGE_FACTOR\n */\n uint16 public constant PERCENTAGE_FACTOR = 10000;\n // kind => impl\n mapping(string => address) public bondImplementations;\n // kind => bond addresses\n mapping(string => address[]) public kindBondsMapping;\n // series => bond addresses\n mapping(string => address[]) public seriesBondsMapping;\n string[] public bondKinds;\n string[] public bondSeries;\n\n // bond => price\n mapping(address => uint256) public bondPrices;\n\n event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice);\n event BondImplementationUpdated(string kind, address implementation, address previousImplementation);\n\n constructor() initializer {}\n\n function initialize(address admin_) public initializer {\n _setAdmin(admin_);\n }\n\n function createBond(\n string memory kind_,\n string memory name_,\n string memory symbol_,\n uint256 initialPrice_,\n string memory series_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external onlyAdmin returns (address bondTokenAddress) {\n address proxyAdmin = address(this);\n address bondImpl = bondImplementations[kind_];\n require(bondImpl != address(0), \"BondFactory: Invalid bond implementation\");\n require(initialPrice_ > 0, \"BondFactory: INVALID_PRICE\");\n bytes memory proxyData;\n DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData);\n bondTokenAddress = address(proxy);\n IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_);\n if (seriesBondsMapping[series_].length == 0) {\n bondSeries.push(series_);\n }\n setPrice(bondTokenAddress, initialPrice_);\n seriesBondsMapping[series_].push(bondTokenAddress);\n kindBondsMapping[kind_].push(bondTokenAddress);\n }\n\n function getBondKinds() external view returns (string[] memory) {\n return bondKinds;\n }\n\n function getBondSeries() external view returns (string[] memory) {\n return bondSeries;\n }\n\n function setBondImplementation(\n string calldata kind_,\n address impl_,\n bool upgradeDeployed_\n ) external onlyAdmin {\n if (bondImplementations[kind_] == address(0)) {\n bondKinds.push(kind_);\n }\n emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]);\n bondImplementations[kind_] = impl_;\n if (!upgradeDeployed_) {\n return;\n }\n for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) {\n DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_);\n }\n }\n\n function setPrice(address bondToken_, uint256 price) public onlyAdmin {\n emit PriceUpdated(bondToken_, price, bondPrices[bondToken_]);\n bondPrices[bondToken_] = price;\n }\n\n function getPrice(address bondToken_) public view returns (uint256) {\n return bondPrices[bondToken_];\n }\n\n function priceDecimals() public view returns (uint256) {\n return 8;\n }\n\n function priceFactor() public view returns (uint256) {\n return 10**priceDecimals();\n }\n\n function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin {\n IBond(bondToken_).underlyingOut(amount_, msg.sender);\n }\n\n function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) {\n // TODO\n return 0;\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n */\n modifier initializer() {\n bool isTopLevelCall = _setInitializedVersion(1);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n * initialization step. This is essential to configure modules that are added through upgrades and that require\n * initialization.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n */\n modifier reinitializer(uint8 version) {\n bool isTopLevelCall = _setInitializedVersion(version);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(version);\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n */\n function _disableInitializers() internal virtual {\n _setInitializedVersion(type(uint8).max);\n }\n\n function _setInitializedVersion(uint8 version) private returns (bool) {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\n // of initializers, because in other contexts the contract may have been reentered.\n if (_initializing) {\n require(\n version == 1 && !AddressUpgradeable.isContract(address(this)),\n \"Initializable: contract is already initialized\"\n );\n return false;\n } else {\n require(_initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n return true;\n }\n }\n}\n" + }, + "contracts/interfaces/IBondFactory.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\ninterface IBondFactory {\n function priceFactor() external view returns (uint256);\n\n function getPrice(address bondToken_) external view returns (uint256 price);\n}\n" + }, + "contracts/interfaces/IBond.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface IBond {\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external;\n\n function underlyingOut(uint256 amount_, address to_) external;\n}\n" + }, + "contracts/libs/Adminable.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nabstract contract Adminable {\n event AdminUpdated(address indexed user, address indexed newAdmin);\n\n address public admin;\n\n modifier onlyAdmin() virtual {\n require(msg.sender == admin, \"UNAUTHORIZED\");\n\n _;\n }\n\n function setAdmin(address newAdmin) public virtual onlyAdmin {\n _setAdmin(newAdmin);\n }\n\n function _setAdmin(address newAdmin) internal {\n require(newAdmin != address(0), \"Can not set admin to zero address\");\n admin = newAdmin;\n\n emit AdminUpdated(msg.sender, newAdmin);\n }\n}\n" + }, + "contracts/libs/DuetTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\nimport \"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\";\n\ncontract DuetTransparentUpgradeableProxy is TransparentUpgradeableProxy {\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {}\n\n /**\n * @dev override parent behavior to manage bonds fully in Factory\n *\n */\n function _beforeFallback() internal virtual override {}\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _changeAdmin(admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\n */\n function changeAdmin(address newAdmin) external virtual ifAdmin {\n _changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1));\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overridden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n Address.isContract(IBeacon(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n" + }, + "@openzeppelin/contracts/interfaces/draft-IERC1822.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n}\n" + }, + "contracts/DiscountBond.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\n\nimport \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./interfaces/IBondFactory.sol\";\n\ncontract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n string public constant kind = \"Discount\";\n uint256 public constant MIN_TRADING_AMOUNT = 1e12;\n\n IBondFactory public factory;\n IERC20Upgradeable public underlyingToken;\n uint256 public maturity;\n string public series;\n uint256 public inventoryAmount;\n uint256 public redeemedAmount;\n\n event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondRedeemed(address indexed account, uint256 amount);\n\n constructor() initializer {}\n\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series_,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external initializer {\n __ERC20_init(name_, symbol_);\n __ReentrancyGuard_init();\n require(\n maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days),\n \"DiscountBond: INVALID_MATURITY\"\n );\n series = series_;\n underlyingToken = underlyingToken_;\n factory = IBondFactory(factory_);\n maturity = maturity_;\n }\n\n modifier beforeMaturity() {\n require(block.timestamp < maturity, \"DiscountBond: MUST_BEFORE_MATURITY\");\n _;\n }\n\n modifier afterMaturity() {\n require(block.timestamp >= maturity, \"DiscountBond: MUST_AFTER_MATURITY\");\n _;\n }\n\n modifier tradingGuard() {\n require(getPrice() > 0, \"INVALID_PRICE\");\n _;\n }\n\n modifier onlyFactory() {\n require(msg.sender == address(factory), \"DiscountBond: UNAUTHORIZED\");\n _;\n }\n\n /**\n * @dev grant specific amount of bond for user mint.\n */\n function grant(uint256 amount_) external onlyFactory {\n inventoryAmount += amount_;\n }\n\n function getPrice() public view returns (uint256) {\n return factory.getPrice(address(this));\n }\n\n function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_)\n external\n beforeMaturity\n returns (uint256 bondAmount)\n {\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_);\n bondAmount = previewMintByUnderlyingAmount(underlyingAmount_);\n inventoryAmount -= bondAmount;\n _mint(account_, bondAmount);\n emit BondMinted(account_, bondAmount, underlyingAmount_);\n }\n\n function previewMintByUnderlyingAmount(uint256 underlyingAmount_)\n public\n beforeMaturity\n tradingGuard\n returns (uint256 bondAmount)\n {\n require(underlyingAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice();\n require(inventoryAmount >= bondAmount, \"DiscountBond: OVER_MINT\");\n }\n\n function mintByBondAmount(address account_, uint256 bondAmount_)\n external\n beforeMaturity\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewMintByBondAmount(bondAmount_);\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount);\n inventoryAmount -= bondAmount_;\n _mint(account_, bondAmount_);\n emit BondMinted(account_, bondAmount_, underlyingAmount);\n }\n\n function previewMintByBondAmount(uint256 bondAmount_)\n public\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(inventoryAmount >= bondAmount_, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n }\n\n function sellByBondAmount(uint256 bondAmount_)\n public\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewSellByBondAmount(bondAmount_);\n _burn(msg.sender, bondAmount_);\n inventoryAmount += bondAmount_;\n underlyingToken.safeTransfer(msg.sender, underlyingAmount);\n emit BondSold(msg.sender, bondAmount_, underlyingAmount);\n }\n\n function previewSellByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function redeem(uint256 bondAmount_) public {\n redeemFor(msg.sender, bondAmount_);\n }\n\n function redeemFor(address account_, uint256 bondAmount_) public afterMaturity {\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n _burn(msg.sender, bondAmount_);\n redeemedAmount += bondAmount_;\n underlyingToken.safeTransfer(account_, bondAmount_);\n emit BondRedeemed(account_, bondAmount_);\n }\n\n /**\n * @notice\n */\n function underlyingOut(uint256 amount_, address to_) external onlyFactory {\n underlyingToken.safeTransfer(to_, amount_);\n }\n\n function emergencyWithdraw(\n IERC20Upgradeable token_,\n address to_,\n uint256 amount_\n ) external onlyFactory {\n token_.safeTransfer(to_, amount_);\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n function safeTransfer(\n IERC20Upgradeable token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20Upgradeable token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Upgradeable.sol\";\nimport \"./extensions/IERC20MetadataUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\n __ERC20_init_unchained(name_, symbol_);\n }\n\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[45] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal onlyInitializing {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + }, + "libraries": { + "": { + "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/solcInputs/c64de78500c453458ed62a1018d284a7.json b/packages/bonds/deployments/bsctest/solcInputs/c64de78500c453458ed62a1018d284a7.json deleted file mode 100644 index aede973..0000000 --- a/packages/bonds/deployments/bsctest/solcInputs/c64de78500c453458ed62a1018d284a7.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/AccidentHandler20220715V3.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\npragma abicoder v2;\n\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\nimport \"@private/shared/libs/Adminable.sol\";\n\n\ncontract AccidentHandler20220715V3 is Initializable, Adminable {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n\n // [user]: [token]: amount # retrievable\n mapping(address => mapping(address => uint)) public userRetrievableTokenMap;\n // [user]: [token]: amount # retrieved\n mapping(address => mapping(address => uint)) public userRetrievedTokenMap;\n // [token]: amount # retrievable\n mapping(address => uint) public remainTokenMap;\n\n uint public endingAt;\n\n event Retrieve(address user, address token, uint amount);\n struct Record {\n address user;\n address token;\n uint amount;\n }\n\n function initialize(address admin_, uint endingAt_) public initializer {\n require(admin_ != address(0), \"Can't set admin to zero address\");\n _setAdmin(admin_);\n setEndingAt(endingAt_);\n }\n\n function retrievables(address[] calldata tokens) external view returns (uint[] memory) {\n uint[] memory amounts = new uint[](tokens.length);\n for (uint i; i < tokens.length; i++) {\n amounts[i] = userRetrievableTokenMap[msg.sender][tokens[i]];\n }\n return amounts;\n }\n\n function retrieved(address[] calldata tokens) external view returns (uint[] memory) {\n uint[] memory amounts = new uint[](tokens.length);\n for (uint i; i < tokens.length; i++) {\n amounts[i] = userRetrievedTokenMap[msg.sender][tokens[i]];\n }\n return amounts;\n }\n\n function setRecords(Record[] calldata records_) external onlyAdmin {\n for (uint i; i < records_.length; i++) {\n Record calldata record = records_[i];\n userRetrievableTokenMap[record.user][record.token] += record.amount;\n remainTokenMap[record.token] += record.amount;\n }\n }\n\n function setEndingAt(uint endingAt_) public onlyAdmin {\n require(endingAt_ != 0 && endingAt_ > block.timestamp, \"Invalid ending time\");\n endingAt = endingAt_;\n }\n\n function retrieveTokens(address[] calldata tokens) external {\n require(endingAt > block.timestamp, \"Out of window\");\n for (uint i; i < tokens.length; i++) {\n IERC20Upgradeable token = IERC20Upgradeable(tokens[i]);\n uint amount = userRetrievableTokenMap[msg.sender][tokens[i]];\n if (amount > 0) {\n delete userRetrievableTokenMap[msg.sender][tokens[i]];\n userRetrievedTokenMap[msg.sender][tokens[i]] += amount;\n remainTokenMap[tokens[i]] -= amount;\n token.safeTransfer(msg.sender, amount);\n emit Retrieve(msg.sender, tokens[i], amount);\n }\n }\n }\n\n}\n" - }, - "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n */\n modifier initializer() {\n bool isTopLevelCall = _setInitializedVersion(1);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n * initialization step. This is essential to configure modules that are added through upgrades and that require\n * initialization.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n */\n modifier reinitializer(uint8 version) {\n bool isTopLevelCall = _setInitializedVersion(version);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(version);\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n */\n function _disableInitializers() internal virtual {\n _setInitializedVersion(type(uint8).max);\n }\n\n function _setInitializedVersion(uint8 version) private returns (bool) {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\n // of initializers, because in other contexts the contract may have been reentered.\n if (_initializing) {\n require(\n version == 1 && !AddressUpgradeable.isContract(address(this)),\n \"Initializable: contract is already initialized\"\n );\n return false;\n } else {\n require(_initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n return true;\n }\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n function safeTransfer(\n IERC20Upgradeable token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20Upgradeable token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" - }, - "@private/shared/libs/Adminable.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nabstract contract Adminable {\n event AdminUpdated(address indexed user, address indexed newAdmin);\n\n address public admin;\n\n modifier onlyAdmin() virtual {\n require(msg.sender == admin, \"UNAUTHORIZED\");\n\n _;\n }\n\n function setAdmin(address newAdmin) public virtual onlyAdmin {\n _setAdmin(newAdmin);\n }\n\n function _setAdmin(address newAdmin) internal {\n require(newAdmin != address(0), \"Can not set admin to zero address\");\n admin = newAdmin;\n\n emit AdminUpdated(msg.sender, newAdmin);\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "storageLayout", - "devdoc", - "userdoc", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "libraries": { - "": { - "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1" - } - } - } -} \ No newline at end of file diff --git a/packages/bonds/package.json b/packages/bonds/package.json index 99f9822..bcbffcc 100644 --- a/packages/bonds/package.json +++ b/packages/bonds/package.json @@ -12,8 +12,8 @@ "compile": "npx hardhat compile", "compile:watch": "npx hardhat watch compile", "clean": "rm -rf artifacts && rm -rf cache && rm -rf coverage && rm -rf typechain", - "deploy:bsc": "npx hardhat deploy --network bsc && ts-node -T ./scripts/clean-solc-inputs.ts", - "deploy:bsctest": "npx hardhat deploy --network bsctest && ts-node -T ./scripts/clean-solc-inputs.ts", + "deploy:bsc": "pnpm run prettier && npx hardhat deploy --network bsc && ts-node -T ./scripts/clean-solc-inputs.ts", + "deploy:bsctest": "pnpm run prettier && npx hardhat deploy --network bsctest && ts-node -T ./scripts/clean-solc-inputs.ts", "deploy:local": "npx hardhat deploy --network local", "verify:bsc": "npx hardhat --network bsc etherscan-verify && npx hardhat --network bsc verify:duet", "verify:bsctest": "npx hardhat --network bsctest etherscan-verify && npx hardhat --network bsctest verify:duet", diff --git a/packages/bonds/scripts/compensasion.ts b/packages/bonds/scripts/compensasion.ts deleted file mode 100644 index 5437fe0..0000000 --- a/packages/bonds/scripts/compensasion.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const tokens = { - BUSD: '0xe9e7cea3dedca5984780bafc599bd69add087d56', - 'dWTI-BUSD': '0x3ebd1b7a27dcc113639fce3a063d6083ef0ef56d', - 'dXAU-BUSD': '0x95ca57ff396864c25520bc97deaae978daaf73f3', - 'dTMC-BUSD': '0xf048897b35963aaed1a241512d26540c7ec42a60', - 'DUET-CAKE': '0xbdf0aa1d1985caa357a6ac6661d838da8691c569', -} From 81be71c085e053022e4ea215f0176f1afc28a64a Mon Sep 17 00:00:00 2001 From: davidduet Date: Mon, 28 Nov 2022 16:35:18 +0800 Subject: [PATCH 3/6] feat(bonds): add bid ask price --- packages/bonds/contracts/BondFactory.sol | 33 +++++--- packages/bonds/contracts/DiscountBond.sol | 16 ++-- .../contracts/interfaces/IBondFactory.sol | 9 ++- .../test/AccidentHandler20220715.test.ts | 75 ------------------- 4 files changed, 41 insertions(+), 92 deletions(-) delete mode 100644 packages/bonds/test/AccidentHandler20220715.test.ts diff --git a/packages/bonds/contracts/BondFactory.sol b/packages/bonds/contracts/BondFactory.sol index 7a80396..658889e 100644 --- a/packages/bonds/contracts/BondFactory.sol +++ b/packages/bonds/contracts/BondFactory.sol @@ -25,7 +25,7 @@ contract BondFactory is IBondFactory, Initializable, Adminable { string[] public bondSeries; // bond => price - mapping(address => uint256) public bondPrices; + mapping(address => BondPrice) public bondPrices; event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice); event BondImplementationUpdated(string kind, address implementation, address previousImplementation); @@ -38,11 +38,19 @@ contract BondFactory is IBondFactory, Initializable, Adminable { _setAdmin(admin_); } + function verifyPrice(BondPrice memory price) public view returns (BondPrice memory) { + require( + price.price > 0 && price.bid > 0 && price.ask > 0 && price.ask >= price.bid, + "BondFactory: INVALID_PRICE" + ); + return price; + } + function createBond( string memory kind_, string memory name_, string memory symbol_, - uint256 initialPrice_, + BondPrice calldata initialPrice_, uint256 initialGrant_, string memory series_, IERC20Upgradeable underlyingToken_, @@ -51,7 +59,7 @@ contract BondFactory is IBondFactory, Initializable, Adminable { address proxyAdmin = address(this); address bondImpl = bondImplementations[kind_]; require(bondImpl != address(0), "BondFactory: Invalid bond implementation"); - require(initialPrice_ > 0, "BondFactory: INVALID_PRICE"); + verifyPrice(initialPrice_); bytes memory proxyData; DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData); bondTokenAddress = address(proxy); @@ -59,7 +67,7 @@ contract BondFactory is IBondFactory, Initializable, Adminable { if (seriesBondsMapping[series_].length == 0) { bondSeries.push(series_); } - setPrice(bondTokenAddress, initialPrice_); + setPrice(bondTokenAddress, initialPrice_.price, initialPrice_.bid, initialPrice_.ask); if (initialGrant_ > 0) { grant(bondTokenAddress, initialGrant_); } @@ -102,13 +110,20 @@ contract BondFactory is IBondFactory, Initializable, Adminable { } } - function setPrice(address bondToken_, uint256 price) public onlyAdmin { - emit PriceUpdated(bondToken_, price, bondPrices[bondToken_]); - bondPrices[bondToken_] = price; + function setPrice( + address bondToken_, + uint256 price, + uint256 bid, + uint256 ask + ) public onlyAdmin { + emit PriceUpdated(bondToken_, price, bondPrices[bondToken_].price); + bondPrices[bondToken_] = BondPrice({ price: price, bid: bid, ask: ask, lastUpdated: block.timestamp }); } - function getPrice(address bondToken_) public view returns (uint256) { - return bondPrices[bondToken_]; + function getPrice(address bondToken_) public view returns (BondPrice memory) { + BondPrice memory price = bondPrices[bondToken_]; + verifyPrice(price); + return price; } function priceDecimals() public view returns (uint256) { diff --git a/packages/bonds/contracts/DiscountBond.sol b/packages/bonds/contracts/DiscountBond.sol index 1d8b5ea..ff47780 100644 --- a/packages/bonds/contracts/DiscountBond.sol +++ b/packages/bonds/contracts/DiscountBond.sol @@ -60,7 +60,6 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { } modifier tradingGuard() { - require(getPrice() > 0, "INVALID_PRICE"); _; } @@ -77,13 +76,14 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { emit BondGranted(amount_, inventoryAmount); } - function getPrice() public view returns (uint256) { + function getPrice() public view returns (IBondFactory.BondPrice memory) { return factory.getPrice(address(this)); } function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_) external beforeMaturity + nonReentrant returns (uint256 bondAmount) { underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_); @@ -101,12 +101,13 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { returns (uint256 bondAmount) { require(underlyingAmount_ >= MIN_TRADING_AMOUNT, "DiscountBond: AMOUNT_TOO_LOW"); - bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice(); + bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice().ask; require(inventoryAmount >= bondAmount, "DiscountBond: INSUFFICIENT_LIQUIDITY"); } function mintByBondAmount(address account_, uint256 bondAmount_) external + nonReentrant beforeMaturity returns (uint256 underlyingAmount) { @@ -126,12 +127,13 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { { require(bondAmount_ >= MIN_TRADING_AMOUNT, "DiscountBond: AMOUNT_TOO_LOW"); require(inventoryAmount >= bondAmount_, "DiscountBond: INSUFFICIENT_LIQUIDITY"); - underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor(); + underlyingAmount = (bondAmount_ * getPrice().ask) / factory.priceFactor(); } function sellByBondAmount(uint256 bondAmount_) public beforeMaturity + nonReentrant tradingGuard returns (uint256 underlyingAmount) { @@ -151,7 +153,7 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { { require(bondAmount_ >= MIN_TRADING_AMOUNT, "DiscountBond: AMOUNT_TOO_LOW"); require(balanceOf(msg.sender) >= bondAmount_, "DiscountBond: EXCEEDS_BALANCE"); - underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor(); + underlyingAmount = (bondAmount_ * getPrice().bid) / factory.priceFactor(); require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, "DiscountBond: INSUFFICIENT_LIQUIDITY"); } @@ -167,10 +169,10 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { if (block.timestamp >= maturity) { return faceValue(bondAmount_); } - return (bondAmount_ * getPrice()) / factory.priceFactor(); + return (bondAmount_ * getPrice().price) / factory.priceFactor(); } - function redeemFor(address account_, uint256 bondAmount_) public afterMaturity { + function redeemFor(address account_, uint256 bondAmount_) public afterMaturity nonReentrant { require(balanceOf(msg.sender) >= bondAmount_, "DiscountBond: EXCEEDS_BALANCE"); _burn(msg.sender, bondAmount_); redeemedAmount += bondAmount_; diff --git a/packages/bonds/contracts/interfaces/IBondFactory.sol b/packages/bonds/contracts/interfaces/IBondFactory.sol index 172a59a..643a8dd 100644 --- a/packages/bonds/contracts/interfaces/IBondFactory.sol +++ b/packages/bonds/contracts/interfaces/IBondFactory.sol @@ -2,7 +2,14 @@ pragma solidity 0.8.9; interface IBondFactory { + struct BondPrice { + uint256 price; + uint256 bid; + uint256 ask; + uint256 lastUpdated; + } + function priceFactor() external view returns (uint256); - function getPrice(address bondToken_) external view returns (uint256 price); + function getPrice(address bondToken_) external view returns (BondPrice memory price); } diff --git a/packages/bonds/test/AccidentHandler20220715.test.ts b/packages/bonds/test/AccidentHandler20220715.test.ts deleted file mode 100644 index aa47cd3..0000000 --- a/packages/bonds/test/AccidentHandler20220715.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { expect, use } from 'chai' -import chaiAsPromised from 'chai-as-promised' -import { ethers } from 'hardhat' -import { AccidentHandler20220715V3, MockERC20 } from '../typechain' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { BigNumber } from 'ethers' - -use(chaiAsPromised) - -describe('AccidentHandler20220715', function () { - let minter: SignerWithAddress - let handler: AccidentHandler20220715V3 - let token: MockERC20 - let user: SignerWithAddress - let timestamp: number - - before(async () => { - ;[minter, user] = await ethers.getSigners() - timestamp = Math.round(Date.now() / 1000) - - const AccidentHandler20220715V3 = await ethers.getContractFactory('AccidentHandler20220715V3') - handler = await AccidentHandler20220715V3.connect(minter).deploy() - - await handler.initialize(minter.address, timestamp + 5 * 60) - - const MockERC20 = await ethers.getContractFactory('MockERC20') - token = await MockERC20.connect(minter).deploy('MockedToken', 'dMT', 10000, 18) - }) - - it('should able to get/set ending time', async () => { - expect(await handler.endingAt()).to.eq(timestamp + 5 * 60) - await handler.setEndingAt(timestamp + 10 * 60) - expect(await handler.endingAt()).to.eq(timestamp + 10 * 60) - }) - - it('should work with correct balance liquidation', async () => { - expect(await handler.remainTokenMap(token.address)).to.eq(0) - expect(await handler.userRetrievableTokenMap(user.address, token.address)).to.eq(0) - expect(await handler.userRetrievedTokenMap(user.address, token.address)).to.eq(0) - expect(await handler.connect(user).retrievables([token.address])).to.deep.eq([BigNumber.from(0)]) - expect(await handler.connect(user).retrieved([token.address])).to.deep.eq([BigNumber.from(0)]) - expect(await token.balanceOf(handler.address)).to.eq(0) - expect(await token.balanceOf(user.address)).to.eq(0) - - await token.mint(handler.address, 10000) - expect(await handler.remainTokenMap(token.address)).to.eq(0) - expect(await handler.userRetrievableTokenMap(user.address, token.address)).to.eq(0) - expect(await handler.userRetrievedTokenMap(user.address, token.address)).to.eq(0) - expect(await handler.connect(user).retrievables([token.address])).to.deep.eq([BigNumber.from(0)]) - expect(await handler.connect(user).retrieved([token.address])).to.deep.eq([BigNumber.from(0)]) - expect(await token.balanceOf(handler.address)).to.eq(10000) - expect(await token.balanceOf(user.address)).to.eq(0) - - await handler.setRecords([ - { user: user.address, token: token.address, amount: 3000 }, - { user: user.address, token: token.address, amount: 7000 }, - ]) - expect(await handler.remainTokenMap(token.address)).to.eq(10000) - expect(await handler.userRetrievableTokenMap(user.address, token.address)).to.eq(10000) - expect(await handler.userRetrievedTokenMap(user.address, token.address)).to.eq(0) - expect(await handler.connect(user).retrievables([token.address])).to.deep.eq([BigNumber.from(10000)]) - expect(await handler.connect(user).retrieved([token.address])).to.deep.eq([BigNumber.from(0)]) - expect(await token.balanceOf(handler.address)).to.eq(10000) - expect(await token.balanceOf(user.address)).to.eq(0) - - await handler.connect(user).retrieveTokens([token.address]) - expect(await handler.remainTokenMap(token.address)).to.eq(0) - expect(await handler.userRetrievableTokenMap(user.address, token.address)).to.eq(0) - expect(await handler.userRetrievedTokenMap(user.address, token.address)).to.eq(10000) - expect(await handler.connect(user).retrievables([token.address])).to.deep.eq([BigNumber.from(0)]) - expect(await handler.connect(user).retrieved([token.address])).to.deep.eq([BigNumber.from(10000)]) - expect(await token.balanceOf(handler.address)).to.eq(0) - expect(await token.balanceOf(user.address)).to.eq(10000) - }) -}) From 9336ba5e1e5ed30786d0801eede612cc203f8960 Mon Sep 17 00:00:00 2001 From: pandaomeng Date: Thu, 10 Nov 2022 09:44:39 +0800 Subject: [PATCH 4/6] test: add test case to Discount bond --- .../bonds/.openzeppelin/unknown-30097.json | 168 ++++++++++++++ packages/bonds/contracts/BondFactory.sol | 7 +- packages/bonds/contracts/DiscountBond.sol | 5 +- packages/bonds/test/DiscountBond.test.ts | 215 ++++++++++++++++++ 4 files changed, 393 insertions(+), 2 deletions(-) create mode 100644 packages/bonds/.openzeppelin/unknown-30097.json create mode 100644 packages/bonds/test/DiscountBond.test.ts diff --git a/packages/bonds/.openzeppelin/unknown-30097.json b/packages/bonds/.openzeppelin/unknown-30097.json new file mode 100644 index 0000000..ca12fe8 --- /dev/null +++ b/packages/bonds/.openzeppelin/unknown-30097.json @@ -0,0 +1,168 @@ +{ + "manifestVersion": "3.2", + "admin": { + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "txHash": "0x9dbf8f65a20ad92dd90fb5c27235ff34db6d545afb58fd92e58b4d6fc940930a" + }, + "proxies": [ + { + "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "txHash": "0x05a5342bce8533c1e8c0c143879f0be16f577ebd8e21a795a8267f592e754285", + "kind": "transparent" + }, + { + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "txHash": "0xf34695a610bd7dd7482882d9d03e261a4a1b66b7e495a1dd25b3c8b208ee422d", + "kind": "transparent" + }, + { + "address": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", + "txHash": "0x6677aed954ce0eb7b490833a8cd40be54d94486e44ec29d92ad585e9d186641b", + "kind": "transparent" + }, + { + "address": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", + "txHash": "0x0b9d065b07870ea0663a9a69bb375f725c5c8c583e1c8434e4939582394ad6ef", + "kind": "transparent" + }, + { + "address": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", + "txHash": "0xf6f8bc98e93979751a99f37a256f4ca59a326cbc9316281876ac42cd84e04aff", + "kind": "transparent" + }, + { + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "txHash": "0xd82d03550751d08ea2952d32381435df3a01c51b0e5c104b35b1e957745e2802", + "kind": "transparent" + } + ], + "impls": { + "90e364f99aaba873eb6ac0c704744a3112c4c3631db953689126a64627327571": { + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "txHash": "0x324906ecbe6607c1a8e4288bc80716df1963993db89b391a63481db78e0c3cd7", + "layout": { + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "admin", + "offset": 2, + "slot": "0", + "type": "t_address", + "contract": "Adminable", + "src": "contracts/libs/Adminable.sol:7" + }, + { + "label": "bondImplementations", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_string_memory_ptr,t_address)", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:19" + }, + { + "label": "kindBondsMapping", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:21" + }, + { + "label": "seriesBondsMapping", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:23" + }, + { + "label": "bondKinds", + "offset": 0, + "slot": "4", + "type": "t_array(t_string_storage)dyn_storage", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:24" + }, + { + "label": "bondSeries", + "offset": 0, + "slot": "5", + "type": "t_array(t_string_storage)dyn_storage", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:25" + }, + { + "label": "bondPrices", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_address,t_uint256)", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:28" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_string_storage)dyn_storage": { + "label": "string[]", + "numberOfBytes": "32" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_string_memory_ptr,t_address)": { + "label": "mapping(string => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)": { + "label": "mapping(string => address[])", + "numberOfBytes": "32" + }, + "t_string_memory_ptr": { + "label": "string", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + } + } +} diff --git a/packages/bonds/contracts/BondFactory.sol b/packages/bonds/contracts/BondFactory.sol index 658889e..bdd0ef2 100644 --- a/packages/bonds/contracts/BondFactory.sol +++ b/packages/bonds/contracts/BondFactory.sol @@ -32,7 +32,10 @@ contract BondFactory is IBondFactory, Initializable, Adminable { event BondCreated(address bondToken); event BondRemoved(address bondToken); - constructor() initializer {} + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } function initialize(address admin_) public initializer { _setAdmin(admin_); @@ -155,6 +158,7 @@ contract BondFactory is IBondFactory, Initializable, Adminable { } kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1]; kindBondsMapping[kind].pop(); + break; } uint256 seriesBondLength = seriesBondsMapping[series].length; @@ -164,6 +168,7 @@ contract BondFactory is IBondFactory, Initializable, Adminable { } seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1]; seriesBondsMapping[series].pop(); + break; } emit BondRemoved(bondTokenAddress); diff --git a/packages/bonds/contracts/DiscountBond.sol b/packages/bonds/contracts/DiscountBond.sol index ff47780..adbcdd4 100644 --- a/packages/bonds/contracts/DiscountBond.sol +++ b/packages/bonds/contracts/DiscountBond.sol @@ -27,7 +27,10 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { event BondRedeemed(address indexed account, uint256 amount); event BondGranted(uint256 amount, uint256 inventoryAmount); - constructor() initializer {} + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } function initialize( string memory name_, diff --git a/packages/bonds/test/DiscountBond.test.ts b/packages/bonds/test/DiscountBond.test.ts new file mode 100644 index 0000000..4ebf2a0 --- /dev/null +++ b/packages/bonds/test/DiscountBond.test.ts @@ -0,0 +1,215 @@ +import { expect, use } from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { ethers, network, upgrades } from 'hardhat' +// eslint-disable-next-line camelcase +import { BondFactory, MockERC20, DiscountBond } from '../typechain' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { BigNumber } from 'ethers' +import { formatUnits, parseEther, parseUnits } from 'ethers/lib/utils' + +use(chaiAsPromised) + +describe('Bonds', function () { + let bondFactory: BondFactory + let usdcToken: MockERC20 + let discountBond: DiscountBond + let bondToken: DiscountBond + let admin: SignerWithAddress + let alice: SignerWithAddress + let bob: SignerWithAddress + + before('Create bond', async () => { + ;[admin, alice, bob] = await ethers.getSigners() + + const BondFactory = await ethers.getContractFactory('BondFactory') + bondFactory = (await upgrades.deployProxy(BondFactory, [admin.address], { + initializer: 'initialize', + })) as BondFactory + await bondFactory.deployed() + + const DiscountBond = await ethers.getContractFactory('DiscountBond') + discountBond = await DiscountBond.connect(admin).deploy() + await bondFactory.setBondImplementation('Discount', discountBond.address, true) + + const MockERC20 = await ethers.getContractFactory('MockERC20') + usdcToken = await MockERC20.connect(admin).deploy('MockedToken', 'USDC', parseEther('10000000'), 18) + // give 2,000,000 usdc to alice + await usdcToken.connect(admin).transfer(alice.address, parseEther('2000000')) + // give 2,000,000 usdc to bob + await usdcToken.connect(admin).transfer(bob.address, parseEther('1000000')) + + const maturityTime = Math.floor(new Date().valueOf() / 1000) + 86400 * 10 + + const tx = await bondFactory + .connect(admin) + .createBond( + 'Discount', + 'dB26W001', + 'T-Bills@26Weeks#001', + parseUnits('0.98', 8), + parseUnits('1000000', 18), + 'USBills', + usdcToken.address, + maturityTime, + ) + + const res = await tx.wait() + expect(res.events).to.not.eq(undefined) + if (!res.events) return + + const event = res.events.find((event) => event.event === 'BondCreated') + expect(event).to.not.eq(undefined) + if (!event || !event.args) return + + const bondTokenAddress = event.args[0] + expect(bondTokenAddress).to.not.eq(undefined) + + bondToken = DiscountBond.attach(bondTokenAddress) + await usdcToken.connect(alice).approve(bondToken.address, ethers.constants.MaxUint256) + await usdcToken.connect(bob).approve(bondToken.address, ethers.constants.MaxUint256) + + // bondToken create success + expect(await bondToken.name()).to.equal('dB26W001') + expect(await bondToken.symbol()).to.equal('T-Bills@26Weeks#001') + expect(await bondToken.kind()).to.equal('Discount') + expect(await bondToken.series()).to.equal('USBills') + expect(await bondToken.getPrice()).to.equal(parseUnits('0.98', 8)) + expect(await bondToken.inventoryAmount()).to.equal(parseEther('1000000')) + expect(await bondToken.underlyingToken()).to.equal(usdcToken.address) + expect(+(await bondToken.maturity())).to.equal(maturityTime) + }) + + it('admin should able to get/set price', async () => { + await bondFactory.connect(admin).setPrice(bondToken.address, parseUnits('0.64', 8)) + expect(formatUnits(await bondToken.getPrice(), 8)).to.equal('0.64') + }) + + const shouldBuyBondCorrectly = async (user: SignerWithAddress, buyAmount: BigNumber) => { + const usdcOfAlice = await usdcToken.balanceOf(user.address) + const usdcOfBondToken = await usdcToken.balanceOf(bondToken.address) + const bondTokenOfAlice = await bondToken.balanceOf(user.address) + const bondTokenOfInventory = await bondToken.inventoryAmount() + + const price = await bondToken.getPrice() + + await bondToken.connect(user).mintByUnderlyingAmount(user.address, buyAmount) + + expect(await usdcToken.balanceOf(user.address)).to.equal(usdcOfAlice.sub(buyAmount)) + expect(await usdcToken.balanceOf(bondToken.address)).to.equal(usdcOfBondToken.add(buyAmount)) + expect(await bondToken.balanceOf(user.address)).to.equal( + bondTokenOfAlice.add(buyAmount.mul(parseUnits('1', 8)).div(price)), + ) + expect(await bondToken.inventoryAmount()).to.equal( + bondTokenOfInventory.sub(buyAmount.mul(parseUnits('1', 8)).div(price)), + ) + } + + it('user can buy bond under the amount of distribution', async () => shouldBuyBondCorrectly(alice, parseEther('100'))) + + it(`user can't buy bond beyond the amount of distribution`, async () => { + await expect( + bondToken.connect(alice).mintByUnderlyingAmount(alice.address, parseEther('1200000')), + ).to.be.revertedWith('DiscountBond: INSUFFICIENT_LIQUIDITY') + }) + + it(`user can buy bond again after grant`, async () => { + const bondTokenOfInventory = await bondToken.inventoryAmount() + + await bondFactory.connect(admin).grant(bondToken.address, parseEther('1000000')) + expect(await bondToken.inventoryAmount()).to.equal(bondTokenOfInventory.add(parseEther('1000000'))) + + await shouldBuyBondCorrectly(alice, parseEther('1200000')) + }) + + it(`user can sell bond`, async () => { + const sellBondAmount = parseEther('36.23832') + + const usdcOfAlice = await usdcToken.balanceOf(alice.address) + const usdcOfBondToken = await usdcToken.balanceOf(bondToken.address) + const bondTokenOfAlice = await bondToken.balanceOf(alice.address) + const bondTokenOfInventory = await bondToken.inventoryAmount() + const price = await bondToken.getPrice() + + await bondToken.connect(alice).sellByBondAmount(sellBondAmount) + + expect(await usdcToken.balanceOf(alice.address)).to.equal( + usdcOfAlice.add(sellBondAmount.mul(price).div(parseUnits('1', 8))), + ) + expect(await usdcToken.balanceOf(bondToken.address)).to.equal( + usdcOfBondToken.sub(sellBondAmount.mul(price).div(parseUnits('1', 8))), + ) + expect(await bondToken.balanceOf(alice.address)).to.equal(bondTokenOfAlice.sub(sellBondAmount)) + expect(await bondToken.inventoryAmount()).to.equal(bondTokenOfInventory.add(sellBondAmount)) + }) + + it(`user can't redeem before maturity time`, async () => { + await expect(bondToken.connect(alice).redeem(parseEther('200.48'))).to.be.revertedWith( + 'DiscountBond: MUST_AFTER_MATURITY', + ) + }) + + it(`user can redeem after maturity time`, async () => { + const redeemAmount = parseEther('200.48') + + const usdcOfAlice = await usdcToken.balanceOf(alice.address) + const usdcOfBondToken = await usdcToken.balanceOf(bondToken.address) + const bondTokenOfAlice = await bondToken.balanceOf(alice.address) + const bondTokenOfRedeemed = await bondToken.redeemedAmount() + + await network.provider.send('evm_increaseTime', [86400 * 20]) + await network.provider.send('evm_mine') + await bondToken.connect(alice).redeem(redeemAmount) + + expect(await usdcToken.balanceOf(alice.address)).to.equal(usdcOfAlice.add(redeemAmount)) + expect(await usdcToken.balanceOf(bondToken.address)).to.equal(usdcOfBondToken.sub(redeemAmount)) + expect(await bondToken.balanceOf(alice.address)).to.equal(bondTokenOfAlice.sub(redeemAmount)) + expect(await bondToken.redeemedAmount()).to.equal(bondTokenOfRedeemed.add(redeemAmount)) + }) + + it(`admin withdraw half of the usdc of bond`, async () => { + const usdcOfBond = await usdcToken.balanceOf(bondToken.address) + const usdcOfAdmin = await usdcToken.balanceOf(admin.address) + + const withdrawAmount = usdcOfBond.div(2) + await bondFactory.connect(admin).underlyingOut(bondToken.address, withdrawAmount) + expect(await usdcToken.balanceOf(admin.address)).to.eq(usdcOfAdmin.add(withdrawAmount)) + expect(await usdcToken.balanceOf(bondToken.address)).to.eq(usdcOfBond.sub(withdrawAmount)) + }) + + it(`should be able to remove bond`, async () => { + const maturityTime = Math.floor(new Date().valueOf() / 1000) + 86400 * 40 + + const tx = await bondFactory + .connect(admin) + .createBond( + 'Discount', + 'dB26W002', + 'T-Bills@26Weeks#002', + parseUnits('0.98', 8), + parseUnits('1000000', 18), + 'USBills', + usdcToken.address, + maturityTime, + ) + + const res = await tx.wait() + expect(res.events).to.not.eq(undefined) + if (!res.events) return + + const event = res.events.find((event) => event.event === 'BondCreated') + expect(event).to.not.eq(undefined) + if (!event || !event.args) return + + const bondTokenAddress = event.args[0] + expect(typeof bondTokenAddress).to.not.eq(undefined) + + const DiscountBond = await ethers.getContractFactory('DiscountBond') + const secondBondToken = DiscountBond.attach(bondTokenAddress) + + expect(+(await bondFactory.getKindBondLength('Discount'))).to.eq(2) + + await bondFactory.connect(admin).removeBond(secondBondToken.address) + + expect(+(await bondFactory.getKindBondLength('Discount'))).to.eq(1) + }) +}) From 66ab2c750e6ece026dd31a3592f67dd7ec417dcb Mon Sep 17 00:00:00 2001 From: pandaomeng Date: Fri, 2 Dec 2022 09:02:56 +0800 Subject: [PATCH 5/6] feat: add isin to Discount Bond --- .../bonds/.openzeppelin/unknown-30097.json | 84 ++++-- packages/bonds/contracts/BondFactory.sol | 28 +- packages/bonds/contracts/DiscountBond.sol | 5 +- packages/bonds/contracts/interfaces/IBond.sol | 5 +- .../deployments/bsctest/BondFactory.json | 170 ++++++++++- .../bsctest/BondFactory_Implementation.json | 276 +++++++++++++++--- .../deployments/bsctest/DiscountBond.json | 116 +++++--- .../21f9402e2ca5f3597c1386289d997b81.json | 106 ------- ... => 6a13f6e055440a5408c02b9e5d62636b.json} | 8 +- packages/bonds/hardhat.config.ts | 3 +- packages/bonds/test/DiscountBond.test.ts | 166 ++++++++--- .../bsc/.extraMeta/CloneFactory.json | 2 +- .../.extraMeta/DPPOracleAdminTemplate.json | 2 +- .../bsc/.extraMeta/DPPOracleTemplate.json | 2 +- .../bsc/.extraMeta/DodoOracle.json | 2 +- .../bsc/.extraMeta/DuetDPPFactory.json | 2 +- .../.extraMeta/DuetDppControllerTemplate.json | 2 +- .../bsc/.extraMeta/DuetDppLpOracle.json | 2 +- .../deployments/bsc/CloneFactory.json | 2 +- .../bsc/DPPOracleAdminTemplate.json | 2 +- .../deployments/bsc/DPPOracleTemplate.json | 2 +- .../deployments/bsc/DodoOracle.json | 6 +- .../bsc/DodoOracle_Implementation.json | 2 +- .../deployments/bsc/DodoOracle_Proxy.json | 6 +- .../deployments/bsc/DuetDPPFactory.json | 30 +- .../bsc/DuetDPPFactory_Implementation.json | 6 +- .../deployments/bsc/DuetDPPFactory_Proxy.json | 30 +- .../bsc/DuetDppControllerTemplate.json | 2 +- .../deployments/bsc/DuetDppLpOracle.json | 6 +- .../bsc/DuetDppLpOracle_Implementation.json | 6 +- .../bsc/DuetDppLpOracle_Proxy.json | 6 +- 31 files changed, 741 insertions(+), 346 deletions(-) delete mode 100644 packages/bonds/deployments/bsctest/solcInputs/21f9402e2ca5f3597c1386289d997b81.json rename packages/bonds/deployments/bsctest/solcInputs/{86b5d7bad88174195e885f97b1fed94c.json => 6a13f6e055440a5408c02b9e5d62636b.json} (86%) diff --git a/packages/bonds/.openzeppelin/unknown-30097.json b/packages/bonds/.openzeppelin/unknown-30097.json index ca12fe8..c9924e4 100644 --- a/packages/bonds/.openzeppelin/unknown-30097.json +++ b/packages/bonds/.openzeppelin/unknown-30097.json @@ -2,7 +2,7 @@ "manifestVersion": "3.2", "admin": { "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "txHash": "0x9dbf8f65a20ad92dd90fb5c27235ff34db6d545afb58fd92e58b4d6fc940930a" + "txHash": "0x508e40f16556f884efe9346aa064b7a944d968e11a6a0121f52c98c71fcce575" }, "proxies": [ { @@ -32,14 +32,14 @@ }, { "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "txHash": "0xd82d03550751d08ea2952d32381435df3a01c51b0e5c104b35b1e957745e2802", + "txHash": "0x8db08f97a68f74991c7e5c1cbb862d976231c78e177e3af453b1af3a57321d24", "kind": "transparent" } ], "impls": { - "90e364f99aaba873eb6ac0c704744a3112c4c3631db953689126a64627327571": { + "5e090fbf34371955420751650894c90591d3dbe577da9a0811bbffea02d2b7b4": { "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "txHash": "0x324906ecbe6607c1a8e4288bc80716df1963993db89b391a63481db78e0c3cd7", + "txHash": "0xc2a2c8b641bf548ca6b2bcf72ca6e252a7b7d8810c819c26ea4db229b3956bf3", "layout": { "storage": [ { @@ -68,52 +68,68 @@ "src": "contracts/libs/Adminable.sol:7" }, { - "label": "bondImplementations", + "label": "keeper", "offset": 0, "slot": "1", + "type": "t_address", + "contract": "Keepable", + "src": "@private/shared/libs/Keepable.sol:7" + }, + { + "label": "bondImplementations", + "offset": 0, + "slot": "2", "type": "t_mapping(t_string_memory_ptr,t_address)", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:19" + "src": "contracts/BondFactory.sol:20" }, { "label": "kindBondsMapping", "offset": 0, - "slot": "2", + "slot": "3", "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:21" + "src": "contracts/BondFactory.sol:22" }, { "label": "seriesBondsMapping", "offset": 0, - "slot": "3", + "slot": "4", "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:23" + "src": "contracts/BondFactory.sol:24" }, { "label": "bondKinds", "offset": 0, - "slot": "4", + "slot": "5", "type": "t_array(t_string_storage)dyn_storage", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:24" + "src": "contracts/BondFactory.sol:25" }, { "label": "bondSeries", "offset": 0, - "slot": "5", + "slot": "6", "type": "t_array(t_string_storage)dyn_storage", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:25" + "src": "contracts/BondFactory.sol:26" + }, + { + "label": "isinBondMapping", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_string_memory_ptr,t_address)", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:29" }, { "label": "bondPrices", "offset": 0, - "slot": "6", - "type": "t_mapping(t_address,t_uint256)", + "slot": "8", + "type": "t_mapping(t_address,t_struct(BondPrice)3954_storage)", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:28" + "src": "contracts/BondFactory.sol:32" } ], "types": { @@ -133,8 +149,8 @@ "label": "bool", "numberOfBytes": "1" }, - "t_mapping(t_address,t_uint256)": { - "label": "mapping(address => uint256)", + "t_mapping(t_address,t_struct(BondPrice)3954_storage)": { + "label": "mapping(address => struct IBondFactory.BondPrice)", "numberOfBytes": "32" }, "t_mapping(t_string_memory_ptr,t_address)": { @@ -153,6 +169,36 @@ "label": "string", "numberOfBytes": "32" }, + "t_struct(BondPrice)3954_storage": { + "label": "struct IBondFactory.BondPrice", + "members": [ + { + "label": "price", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "bid", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "ask", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "lastUpdated", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, "t_uint256": { "label": "uint256", "numberOfBytes": "32" diff --git a/packages/bonds/contracts/BondFactory.sol b/packages/bonds/contracts/BondFactory.sol index bdd0ef2..0e3ba83 100644 --- a/packages/bonds/contracts/BondFactory.sol +++ b/packages/bonds/contracts/BondFactory.sol @@ -8,8 +8,9 @@ import "./interfaces/IBondFactory.sol"; import "./interfaces/IBond.sol"; import "./libs/Adminable.sol"; import "./libs/DuetTransparentUpgradeableProxy.sol"; +import "@private/shared/libs/Keepable.sol"; -contract BondFactory is IBondFactory, Initializable, Adminable { +contract BondFactory is IBondFactory, Initializable, Adminable, Keepable { /** * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%; * Calculation formula: x * percentage / PERCENTAGE_FACTOR @@ -24,6 +25,9 @@ contract BondFactory is IBondFactory, Initializable, Adminable { string[] public bondKinds; string[] public bondSeries; + // isin => bond address + mapping(string => address) public isinBondMapping; + // bond => price mapping(address => BondPrice) public bondPrices; @@ -32,6 +36,16 @@ contract BondFactory is IBondFactory, Initializable, Adminable { event BondCreated(address bondToken); event BondRemoved(address bondToken); + modifier onlyAdminOrKeeper() virtual { + require(msg.sender == admin || msg.sender == keeper, "UNAUTHORIZED"); + + _; + } + + function setKeeper(address newKeeper) external onlyAdmin { + _setKeeper(newKeeper); + } + /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); @@ -57,16 +71,20 @@ contract BondFactory is IBondFactory, Initializable, Adminable { uint256 initialGrant_, string memory series_, IERC20Upgradeable underlyingToken_, - uint256 maturity_ + uint256 maturity_, + string memory isin_ ) external onlyAdmin returns (address bondTokenAddress) { address proxyAdmin = address(this); address bondImpl = bondImplementations[kind_]; require(bondImpl != address(0), "BondFactory: Invalid bond implementation"); + require(isinBondMapping[isin_] == address(0), "A bond for this isin already exists"); verifyPrice(initialPrice_); bytes memory proxyData; DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData); bondTokenAddress = address(proxy); - IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_); + IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_, isin_); + isinBondMapping[isin_] = bondTokenAddress; + if (seriesBondsMapping[series_].length == 0) { bondSeries.push(series_); } @@ -118,7 +136,7 @@ contract BondFactory is IBondFactory, Initializable, Adminable { uint256 price, uint256 bid, uint256 ask - ) public onlyAdmin { + ) public onlyAdminOrKeeper { emit PriceUpdated(bondToken_, price, bondPrices[bondToken_].price); bondPrices[bondToken_] = BondPrice({ price: price, bid: bid, ask: ask, lastUpdated: block.timestamp }); } @@ -171,6 +189,8 @@ contract BondFactory is IBondFactory, Initializable, Adminable { break; } + delete isinBondMapping[bondToken_.isin()]; + emit BondRemoved(bondTokenAddress); } diff --git a/packages/bonds/contracts/DiscountBond.sol b/packages/bonds/contracts/DiscountBond.sol index adbcdd4..07f1a56 100644 --- a/packages/bonds/contracts/DiscountBond.sol +++ b/packages/bonds/contracts/DiscountBond.sol @@ -21,6 +21,7 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { string public series; uint256 public inventoryAmount; uint256 public redeemedAmount; + string public isin; event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount); event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount); @@ -38,7 +39,8 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { string memory series_, address factory_, IERC20Upgradeable underlyingToken_, - uint256 maturity_ + uint256 maturity_, + string memory isin_ ) external initializer { __ERC20_init(name_, symbol_); __ReentrancyGuard_init(); @@ -50,6 +52,7 @@ contract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond { underlyingToken = underlyingToken_; factory = IBondFactory(factory_); maturity = maturity_; + isin = isin_; } modifier beforeMaturity() { diff --git a/packages/bonds/contracts/interfaces/IBond.sol b/packages/bonds/contracts/interfaces/IBond.sol index 59392c6..94e3b8b 100644 --- a/packages/bonds/contracts/interfaces/IBond.sol +++ b/packages/bonds/contracts/interfaces/IBond.sol @@ -11,13 +11,16 @@ interface IBond is IERC20Upgradeable { string memory series, address factory_, IERC20Upgradeable underlyingToken_, - uint256 maturity_ + uint256 maturity_, + string memory isin_ ) external; function kind() external returns (string memory); function series() external returns (string memory); + function isin() external returns (string memory); + function underlyingOut(uint256 amount_, address to_) external; function grant(uint256 amount_) external; diff --git a/packages/bonds/deployments/bsctest/BondFactory.json b/packages/bonds/deployments/bsctest/BondFactory.json index e6c0c32..46e0ec1 100644 --- a/packages/bonds/deployments/bsctest/BondFactory.json +++ b/packages/bonds/deployments/bsctest/BondFactory.json @@ -307,7 +307,22 @@ "outputs": [ { "internalType": "uint256", - "name": "", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", "type": "uint256" } ], @@ -375,9 +390,31 @@ "type": "string" }, { - "internalType": "uint256", + "components": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", + "type": "uint256" + } + ], + "internalType": "struct IBondFactory.BondPrice", "name": "initialPrice_", - "type": "uint256" + "type": "tuple" }, { "internalType": "uint256", @@ -398,6 +435,11 @@ "internalType": "uint256", "name": "maturity_", "type": "uint256" + }, + { + "internalType": "string", + "name": "isin_", + "type": "string" } ], "name": "createBond", @@ -467,9 +509,31 @@ "name": "getPrice", "outputs": [ { - "internalType": "uint256", + "components": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", + "type": "uint256" + } + ], + "internalType": "struct IBondFactory.BondPrice", "name": "", - "type": "uint256" + "type": "tuple" } ], "stateMutability": "view", @@ -525,6 +589,25 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "isinBondMapping", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -659,6 +742,16 @@ "internalType": "uint256", "name": "price", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" } ], "name": "setPrice", @@ -684,6 +777,69 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", + "type": "uint256" + } + ], + "internalType": "struct IBondFactory.BondPrice", + "name": "price", + "type": "tuple" + } + ], + "name": "verifyPrice", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", + "type": "uint256" + } + ], + "internalType": "struct IBondFactory.BondPrice", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -785,12 +941,12 @@ "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", "0xc4d66de8000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" ], - "numDeployments": 4, + "numDeployments": 5, "solcInputHash": "41a8600e180880fe88609322a6b2ac21", "metadata": "{\"compiler\":{\"version\":\"0.8.10+commit.fc410830\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"ownerAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"id\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"Proxy implementing EIP173 for ownership management\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.8/proxy/EIP173Proxy.sol\":\"EIP173Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[]},\"sources\":{\"solc_0.8/proxy/EIP173Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Proxy.sol\\\";\\n\\ninterface ERC165 {\\n function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n///@notice Proxy implementing EIP173 for ownership management\\ncontract EIP173Proxy is Proxy {\\n // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n constructor(\\n address implementationAddress,\\n address ownerAddress,\\n bytes memory data\\n ) payable {\\n _setImplementation(implementationAddress, data);\\n _setOwner(ownerAddress);\\n }\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n function owner() external view returns (address) {\\n return _owner();\\n }\\n\\n function supportsInterface(bytes4 id) external view returns (bool) {\\n if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n return true;\\n }\\n if (id == 0xFFFFFFFF) {\\n return false;\\n }\\n\\n ERC165 implementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n implementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n // In practise this is unlikely to be an issue.\\n try implementation.supportsInterface(id) returns (bool support) {\\n return support;\\n } catch {\\n return false;\\n }\\n }\\n\\n function transferOwnership(address newOwner) external onlyOwner {\\n _setOwner(newOwner);\\n }\\n\\n function upgradeTo(address newImplementation) external onlyOwner {\\n _setImplementation(newImplementation, \\\"\\\");\\n }\\n\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable onlyOwner {\\n _setImplementation(newImplementation, data);\\n }\\n\\n // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n modifier onlyOwner() {\\n require(msg.sender == _owner(), \\\"NOT_AUTHORIZED\\\");\\n _;\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _owner() internal view returns (address adminAddress) {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n adminAddress := sload(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103)\\n }\\n }\\n\\n function _setOwner(address newOwner) internal {\\n address previousOwner = _owner();\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103, newOwner)\\n }\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xb9c14a66c8a4eefabca13cc8dd8133c1587909bb1124fa793c50ab46358b63e4\",\"license\":\"MIT\"},\"solc_0.8/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\\n\\n event ProxyImplementationUpdated(address indexed previousImplementation, address indexed newImplementation);\\n\\n // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n receive() external payable virtual {\\n revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\n }\\n\\n fallback() external payable {\\n _fallback();\\n }\\n\\n // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n function _fallback() internal {\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n let implementationAddress := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n calldatacopy(0x0, 0x0, calldatasize())\\n let success := delegatecall(gas(), implementationAddress, 0x0, calldatasize(), 0, 0)\\n let retSz := returndatasize()\\n returndatacopy(0, 0, retSz)\\n switch success\\n case 0 {\\n revert(0, retSz)\\n }\\n default {\\n return(0, retSz)\\n }\\n }\\n }\\n\\n function _setImplementation(address newImplementation, bytes memory data) internal {\\n address previousImplementation;\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n previousImplementation := sload(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc)\\n }\\n\\n // solhint-disable-next-line security/no-inline-assembly\\n assembly {\\n sstore(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc, newImplementation)\\n }\\n\\n emit ProxyImplementationUpdated(previousImplementation, newImplementation);\\n\\n if (data.length > 0) {\\n (bool success, ) = newImplementation.delegatecall(data);\\n if (!success) {\\n assembly {\\n // This assembly ensure the revert contains the exact string data\\n let returnDataSize := returndatasize()\\n returndatacopy(0, 0, returnDataSize)\\n revert(0, returnDataSize)\\n }\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x68c8cf1a340a53d31de8ed808bb66d64e83d50b20d80a0b2dff6aba903cebc98\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x608060405260405162000ccc38038062000ccc8339810160408190526200002691620001fc565b62000032838262000046565b6200003d8262000128565b505050620002fa565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511562000123576000836001600160a01b031683604051620000ca9190620002dc565b600060405180830381855af49150503d806000811462000107576040519150601f19603f3d011682016040523d82523d6000602084013e6200010c565b606091505b505090508062000121573d806000803e806000fd5b505b505050565b60006200014260008051602062000cac8339815191525490565b90508160008051602062000cac83398151915255816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80516001600160a01b0381168114620001b257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620001ea578181015183820152602001620001d0565b83811115620001215750506000910152565b6000806000606084860312156200021257600080fd5b6200021d846200019a565b92506200022d602085016200019a565b60408501519092506001600160401b03808211156200024b57600080fd5b818601915086601f8301126200026057600080fd5b815181811115620002755762000275620001b7565b604051601f8201601f19908116603f01168101908382118183101715620002a057620002a0620001b7565b81604052828152896020848701011115620002ba57600080fd5b620002cd836020830160208801620001cd565b80955050505050509250925092565b60008251620002f0818460208701620001cd565b9190910192915050565b6109a2806200030a6000396000f3fe60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", "deployedBytecode": "0x60806040526004361061005e5760003560e01c80634f1ef286116100435780634f1ef286146101295780638da5cb5b1461013c578063f2fde38b14610176576100ca565b806301ffc9a7146100d45780633659cfe614610109576100ca565b366100ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f45544845525f52454a454354454400000000000000000000000000000000000060448201526064015b60405180910390fd5b6100d2610196565b005b3480156100e057600080fd5b506100f46100ef366004610806565b6101e1565b60405190151581526020015b60405180910390f35b34801561011557600080fd5b506100d2610124366004610871565b6103af565b6100d261013736600461088c565b610481565b34801561014857600080fd5b5061015161057c565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610100565b34801561018257600080fd5b506100d2610191366004610871565b6105ab565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101d7578183f35b8183fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061027457507f7f5828d0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b1561028157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000080831614156102b357506000919050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008416600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa92505050801561039b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526103989181019061090f565b60015b6103a85750600092915050565b9392505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e816040518060200160405280600081525061066a565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b6105778383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061066a92505050565b505050565b60006105a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b905090565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016100c1565b61047e81610759565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80549083905560405173ffffffffffffffffffffffffffffffffffffffff80851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a38151156105775760008373ffffffffffffffffffffffffffffffffffffffff16836040516107059190610931565b600060405180830381855af49150503d8060008114610740576040519150601f19603f3d011682016040523d82523d6000602084013e610745565b606091505b50509050806101db573d806000803e806000fd5b60006107837fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050817fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103558173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006020828403121561081857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146103a857600080fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461086c57600080fd5b919050565b60006020828403121561088357600080fd5b6103a882610848565b6000806000604084860312156108a157600080fd5b6108aa84610848565b9250602084013567ffffffffffffffff808211156108c757600080fd5b818601915086601f8301126108db57600080fd5b8135818111156108ea57600080fd5b8760208285010111156108fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561092157600080fd5b815180151581146103a857600080fd5b6000825160005b818110156109525760208186018101518583015201610938565b81811115610961576000828501525b50919091019291505056fea2646970667358221220d2ec357659da93a66b21590e3c56e508e51e4de5703da4d1f7ba0b98d9e047f964736f6c634300080a0033", - "implementation": "0x5a162c749ef599F3Da52D0f0beb026Ec1Ed99206", + "implementation": "0x8e1d9be324C17D9a2F27d5a7470281f7FAAD8470", "devdoc": { "kind": "dev", "methods": {}, diff --git a/packages/bonds/deployments/bsctest/BondFactory_Implementation.json b/packages/bonds/deployments/bsctest/BondFactory_Implementation.json index 5f7fe07..745b1fe 100644 --- a/packages/bonds/deployments/bsctest/BondFactory_Implementation.json +++ b/packages/bonds/deployments/bsctest/BondFactory_Implementation.json @@ -1,5 +1,5 @@ { - "address": "0x5a162c749ef599F3Da52D0f0beb026Ec1Ed99206", + "address": "0x8e1d9be324C17D9a2F27d5a7470281f7FAAD8470", "abi": [ { "inputs": [], @@ -190,7 +190,22 @@ "outputs": [ { "internalType": "uint256", - "name": "", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", "type": "uint256" } ], @@ -258,9 +273,31 @@ "type": "string" }, { - "internalType": "uint256", + "components": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", + "type": "uint256" + } + ], + "internalType": "struct IBondFactory.BondPrice", "name": "initialPrice_", - "type": "uint256" + "type": "tuple" }, { "internalType": "uint256", @@ -281,6 +318,11 @@ "internalType": "uint256", "name": "maturity_", "type": "uint256" + }, + { + "internalType": "string", + "name": "isin_", + "type": "string" } ], "name": "createBond", @@ -350,9 +392,31 @@ "name": "getPrice", "outputs": [ { - "internalType": "uint256", + "components": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", + "type": "uint256" + } + ], + "internalType": "struct IBondFactory.BondPrice", "name": "", - "type": "uint256" + "type": "tuple" } ], "stateMutability": "view", @@ -408,6 +472,25 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "isinBondMapping", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -542,6 +625,16 @@ "internalType": "uint256", "name": "price", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" } ], "name": "setPrice", @@ -566,46 +659,100 @@ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", + "type": "uint256" + } + ], + "internalType": "struct IBondFactory.BondPrice", + "name": "price", + "type": "tuple" + } + ], + "name": "verifyPrice", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", + "type": "uint256" + } + ], + "internalType": "struct IBondFactory.BondPrice", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" } ], - "transactionHash": "0x6f873ec33aac45b818ff6c60915c230d2db892d9b111493caaa262ad27705ba5", + "transactionHash": "0xe340f20875534cb5fa091b7079b7c56b12f22ea447ba7633bba64de052df481f", "receipt": { "to": null, "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", - "contractAddress": "0x5a162c749ef599F3Da52D0f0beb026Ec1Ed99206", - "transactionIndex": 1, - "gasUsed": "2657721", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xa2b68657dd4cb20659d020212351fafcb6687c27b3d2dbbb17294d802bb9803d", - "transactionHash": "0x6f873ec33aac45b818ff6c60915c230d2db892d9b111493caaa262ad27705ba5", - "logs": [ - { - "transactionIndex": 1, - "blockNumber": 24233291, - "transactionHash": "0x6f873ec33aac45b818ff6c60915c230d2db892d9b111493caaa262ad27705ba5", - "address": "0x5a162c749ef599F3Da52D0f0beb026Ec1Ed99206", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 1, - "blockHash": "0xa2b68657dd4cb20659d020212351fafcb6687c27b3d2dbbb17294d802bb9803d" - } - ], - "blockNumber": 24233291, - "cumulativeGasUsed": "2839358", + "contractAddress": "0x8e1d9be324C17D9a2F27d5a7470281f7FAAD8470", + "transactionIndex": 19, + "gasUsed": "2916806", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x47713078c863b5b0634e6ea411124c1d5d210e2f18877e7b61d8b951e70e119c", + "transactionHash": "0xe340f20875534cb5fa091b7079b7c56b12f22ea447ba7633bba64de052df481f", + "logs": [], + "blockNumber": 25186788, + "cumulativeGasUsed": "5460289", "status": 1, "byzantium": true }, "args": [], - "numDeployments": 8, - "solcInputHash": "21f9402e2ca5f3597c1386289d997b81", - "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"bondToken\",\"type\":\"address\"}],\"name\":\"BondCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"kind\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"}],\"name\":\"BondImplementationUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"bondToken\",\"type\":\"address\"}],\"name\":\"BondRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bondToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousPrice\",\"type\":\"uint256\"}],\"name\":\"PriceUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"PERCENTAGE_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"bondImplementations\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"bondKinds\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"bondPrices\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"bondSeries\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"tradingAmount\",\"type\":\"uint256\"}],\"name\":\"calculateFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"initialPrice_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"initialGrant_\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"series_\",\"type\":\"string\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"underlyingToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maturity_\",\"type\":\"uint256\"}],\"name\":\"createBond\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"bondTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBondKinds\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBondSeries\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"}],\"name\":\"getKindBondLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"}],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"series_\",\"type\":\"string\"}],\"name\":\"getSeriesBondLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"grant\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kindBondsMapping\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"priceDecimals\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"priceFactor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IBond\",\"name\":\"bondToken_\",\"type\":\"address\"}],\"name\":\"removeBond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"seriesBondsMapping\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"impl_\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"upgradeDeployed_\",\"type\":\"bool\"}],\"name\":\"setBondImplementation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"setPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"underlyingOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"PERCENTAGE_FACTOR\":{\"details\":\"factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%; Calculation formula: x * percentage / PERCENTAGE_FACTOR\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/BondFactory.sol\":\"BondFactory\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC1967/ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\\n * clashing], which can potentially be used in an attack, this contract uses the\\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\\n * things that go hand in hand:\\n *\\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\\n * that call matches one of the admin functions exposed by the proxy itself.\\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\\n * \\\"admin cannot fallback to proxy target\\\".\\n *\\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\\n * to sudden errors when trying to call a function from the proxy implementation.\\n *\\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n /**\\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\\n */\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable ERC1967Proxy(_logic, _data) {\\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1));\\n _changeAdmin(admin_);\\n }\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function admin() external ifAdmin returns (address admin_) {\\n admin_ = _getAdmin();\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function implementation() external ifAdmin returns (address implementation_) {\\n implementation_ = _implementation();\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\\n */\\n function changeAdmin(address newAdmin) external virtual ifAdmin {\\n _changeAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\\n */\\n function upgradeTo(address newImplementation) external ifAdmin {\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\\n */\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\\n _upgradeToAndCall(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\\n */\\n function _beforeFallback() internal virtual override {\\n require(msg.sender != _getAdmin(), \\\"TransparentUpgradeableProxy: admin cannot fallback to proxy target\\\");\\n super._beforeFallback();\\n }\\n}\\n\",\"keccak256\":\"0x140055a64cf579d622e04f5a198595832bf2cb193cd0005f4f2d4d61ca906253\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2ccf9d2313a313d41a791505f2b5abfdc62191b5d4334f7f7a82691c088a1c87\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"},\"contracts/BondFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n\\nimport \\\"./interfaces/IBondFactory.sol\\\";\\nimport \\\"./interfaces/IBond.sol\\\";\\nimport \\\"./libs/Adminable.sol\\\";\\nimport \\\"./libs/DuetTransparentUpgradeableProxy.sol\\\";\\n\\ncontract BondFactory is IBondFactory, Initializable, Adminable {\\n /**\\n * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%;\\n * Calculation formula: x * percentage / PERCENTAGE_FACTOR\\n */\\n uint16 public constant PERCENTAGE_FACTOR = 10000;\\n // kind => impl\\n mapping(string => address) public bondImplementations;\\n // kind => bond addresses\\n mapping(string => address[]) public kindBondsMapping;\\n // series => bond addresses\\n mapping(string => address[]) public seriesBondsMapping;\\n string[] public bondKinds;\\n string[] public bondSeries;\\n\\n // bond => price\\n mapping(address => uint256) public bondPrices;\\n\\n event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice);\\n event BondImplementationUpdated(string kind, address implementation, address previousImplementation);\\n event BondCreated(address bondToken);\\n event BondRemoved(address bondToken);\\n\\n constructor() initializer {}\\n\\n function initialize(address admin_) public initializer {\\n _setAdmin(admin_);\\n }\\n\\n function createBond(\\n string memory kind_,\\n string memory name_,\\n string memory symbol_,\\n uint256 initialPrice_,\\n uint256 initialGrant_,\\n string memory series_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_\\n ) external onlyAdmin returns (address bondTokenAddress) {\\n address proxyAdmin = address(this);\\n address bondImpl = bondImplementations[kind_];\\n require(bondImpl != address(0), \\\"BondFactory: Invalid bond implementation\\\");\\n require(initialPrice_ > 0, \\\"BondFactory: INVALID_PRICE\\\");\\n bytes memory proxyData;\\n DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData);\\n bondTokenAddress = address(proxy);\\n IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_);\\n if (seriesBondsMapping[series_].length == 0) {\\n bondSeries.push(series_);\\n }\\n setPrice(bondTokenAddress, initialPrice_);\\n if (initialGrant_ > 0) {\\n grant(bondTokenAddress, initialGrant_);\\n }\\n seriesBondsMapping[series_].push(bondTokenAddress);\\n kindBondsMapping[kind_].push(bondTokenAddress);\\n emit BondCreated(bondTokenAddress);\\n }\\n\\n function getBondKinds() external view returns (string[] memory) {\\n return bondKinds;\\n }\\n\\n function getKindBondLength(string memory kind_) external view returns (uint256) {\\n return kindBondsMapping[kind_].length;\\n }\\n\\n function getBondSeries() external view returns (string[] memory) {\\n return bondSeries;\\n }\\n\\n function getSeriesBondLength(string memory series_) external view returns (uint256) {\\n return seriesBondsMapping[series_].length;\\n }\\n\\n function setBondImplementation(\\n string calldata kind_,\\n address impl_,\\n bool upgradeDeployed_\\n ) external onlyAdmin {\\n if (bondImplementations[kind_] == address(0)) {\\n bondKinds.push(kind_);\\n }\\n emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]);\\n bondImplementations[kind_] = impl_;\\n if (!upgradeDeployed_) {\\n return;\\n }\\n for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) {\\n DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_);\\n }\\n }\\n\\n function setPrice(address bondToken_, uint256 price) public onlyAdmin {\\n emit PriceUpdated(bondToken_, price, bondPrices[bondToken_]);\\n bondPrices[bondToken_] = price;\\n }\\n\\n function getPrice(address bondToken_) public view returns (uint256) {\\n return bondPrices[bondToken_];\\n }\\n\\n function priceDecimals() public view returns (uint256) {\\n return 8;\\n }\\n\\n function priceFactor() public view returns (uint256) {\\n return 10**priceDecimals();\\n }\\n\\n function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin {\\n IBond(bondToken_).underlyingOut(amount_, msg.sender);\\n }\\n\\n function grant(address bondToken_, uint256 amount_) public onlyAdmin {\\n IBond(bondToken_).grant(amount_);\\n }\\n\\n function removeBond(IBond bondToken_) external onlyAdmin {\\n require(bondToken_.totalSupply() <= 0, \\\"BondFactory: CANT_REMOVE\\\");\\n string memory kind = bondToken_.kind();\\n string memory series = bondToken_.series();\\n address bondTokenAddress = address(bondToken_);\\n\\n uint256 kindBondLength = kindBondsMapping[kind].length;\\n for (uint256 i = 0; i < kindBondLength; i++) {\\n if (kindBondsMapping[kind][i] != bondTokenAddress) {\\n continue;\\n }\\n kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1];\\n kindBondsMapping[kind].pop();\\n }\\n\\n uint256 seriesBondLength = seriesBondsMapping[series].length;\\n for (uint256 j = 0; j < seriesBondLength; j++) {\\n if (seriesBondsMapping[series][j] != bondTokenAddress) {\\n continue;\\n }\\n seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1];\\n seriesBondsMapping[series].pop();\\n }\\n\\n emit BondRemoved(bondTokenAddress);\\n }\\n\\n function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) {\\n // TODO\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xb3da317ea41aa150d47492627b0959df7a26db1871ab4291a7eeeb84135a7280\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBond.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface IBond is IERC20Upgradeable {\\n function initialize(\\n string memory name_,\\n string memory symbol_,\\n string memory series,\\n address factory_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_\\n ) external;\\n\\n function kind() external returns (string memory);\\n\\n function series() external returns (string memory);\\n\\n function underlyingOut(uint256 amount_, address to_) external;\\n\\n function grant(uint256 amount_) external;\\n\\n function faceValue(uint256 bondAmount_) external view returns (uint256);\\n\\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x2e6653c949a3ae433a1e7ed6c7fd37b3886cd073be18d9c5e9402358cf36e8ff\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBondFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\ninterface IBondFactory {\\n function priceFactor() external view returns (uint256);\\n\\n function getPrice(address bondToken_) external view returns (uint256 price);\\n}\\n\",\"keccak256\":\"0x43ebf47455cddb545064cb42203f7973492dbf15c1e7204d5c0fefbd8aea8e23\",\"license\":\"GPL-3.0\"},\"contracts/libs/Adminable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nabstract contract Adminable {\\n event AdminUpdated(address indexed user, address indexed newAdmin);\\n\\n address public admin;\\n\\n modifier onlyAdmin() virtual {\\n require(msg.sender == admin, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n function setAdmin(address newAdmin) public virtual onlyAdmin {\\n _setAdmin(newAdmin);\\n }\\n\\n function _setAdmin(address newAdmin) internal {\\n require(newAdmin != address(0), \\\"Can not set admin to zero address\\\");\\n admin = newAdmin;\\n\\n emit AdminUpdated(msg.sender, newAdmin);\\n }\\n}\\n\",\"keccak256\":\"0xe47c97c0e3edad2d1df3e664376a7bb46e1aaf51b4c4acc73c4a2cfdc747185f\",\"license\":\"GPL-3.0\"},\"contracts/libs/DuetTransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\nimport \\\"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\\\";\\n\\ncontract DuetTransparentUpgradeableProxy is TransparentUpgradeableProxy {\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {}\\n\\n /**\\n * @dev override parent behavior to manage bonds fully in Factory\\n *\\n */\\n function _beforeFallback() internal virtual override {}\\n}\\n\",\"keccak256\":\"0xe59f85b113777531c6519e0cd2bedbc35844ca809a153b10a9f17840042978b1\",\"license\":\"GPL-3.0\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50600062000020600162000087565b9050801562000039576000805461ff0019166101001790555b801562000080576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50620001a8565b60008054610100900460ff161562000120578160ff166001148015620000c05750620000be306200019960201b620014f01760201c565b155b620001185760405162461bcd60e51b815260206004820152602e60248201526000805160206200305d83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff8084169116106200017f5760405162461bcd60e51b815260206004820152602e60248201526000805160206200305d83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016200010f565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b612ea580620001b86000396000f3fe60806040523480156200001157600080fd5b5060043610620001745760003560e01c80637c33d3d811620000d3578063ef0cef6c1162000086578063ef0cef6c1462000350578063efc51bca1462000367578063f21c5563146200039e578063f851a44014620003b5578063f920ea5414620003cf578063fd5b909214620003e657600080fd5b80637c33d3d814620002cd578063b67afd8814620002e4578063c4d66de81462000307578063dfb2866d146200031e578063e988b66f1462000328578063ee01e5e7146200033257600080fd5b806341976e09116200012c57806341976e09146200021d5780636016338b14620002495780636141380214620002625780636370920e1462000288578063704b6c02146200029f57806373f7e98a14620002b657600080fd5b8062e4768b146200017957806305300b2814620001925780630f988f7014620001a857806326eb508514620001bf57806334b4fc7614620001ef578063381bac331462000206575b600080fd5b620001906200018a36600462001792565b620003fd565b005b60085b6040519081526020015b60405180910390f35b62000190620001b936600462001792565b620004a6565b620001d6620001d036600462001892565b62000540565b6040516001600160a01b0390911681526020016200019f565b620001d662000200366004620018e8565b62000588565b6200019562000217366004620019d2565b620008bb565b620001956200022e36600462001a13565b6001600160a01b031660009081526006602052604090205490565b62000253620008e5565b6040516200019f919062001a97565b620002796200027336600462001afd565b620009c8565b6040516200019f919062001b17565b620001906200029936600462001792565b62000a7d565b62000190620002b036600462001a13565b62000ade565b62000195620002c736600462001892565b62000b1f565b620001d6620002de36600462001892565b62000b28565b62000195620002f536600462001a13565b60066020526000908152604090205481565b620001906200031836600462001a13565b62000b54565b6200019562000bd1565b6200025362000be6565b6200033c61271081565b60405161ffff90911681526020016200019f565b620002796200036136600462001afd565b62000cc0565b620001d662000378366004620019d2565b80516020818301810180516001825292820191909301209152546001600160a01b031681565b62000195620003af366004620019d2565b62000cd1565b600054620001d6906201000090046001600160a01b031681565b62000190620003e036600462001b2c565b62000ce5565b62000190620003f736600462001a13565b62000f3f565b6000546201000090046001600160a01b03163314620004395760405162461bcd60e51b8152600401620004309062001bcd565b60405180910390fd5b6001600160a01b038216600081815260066020908152604091829020548251858152918201527fb556fac599c3c70efb9ab1fa725ecace6c81cc48d1455f886607def065f3e0c0910160405180910390a26001600160a01b03909116600090815260066020526040902055565b6000546201000090046001600160a01b03163314620004d95760405162461bcd60e51b8152600401620004309062001bcd565b604051633f78aea360e21b8152600481018290523360248201526001600160a01b0383169063fde2ba8c906044015b600060405180830381600087803b1580156200052357600080fd5b505af115801562000538573d6000803e3d6000fd5b505050505050565b815160208184018101805160038252928201918501919091209190528054829081106200056c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080546201000090046001600160a01b03163314620005bc5760405162461bcd60e51b8152600401620004309062001bcd565b6000309050600060018b604051620005d5919062001bf3565b908152604051908190036020019020546001600160a01b0316905080620006505760405162461bcd60e51b815260206004820152602860248201527f426f6e64466163746f72793a20496e76616c696420626f6e6420696d706c656d60448201526732b73a30ba34b7b760c11b606482015260840162000430565b60008811620006a25760405162461bcd60e51b815260206004820152601a60248201527f426f6e64466163746f72793a20494e56414c49445f5052494345000000000000604482015260640162000430565b60606000828483604051620006b7906200164b565b620006c59392919062001c11565b604051809103906000f080158015620006e2573d6000803e3d6000fd5b50604051634b71ae7560e11b81529095508591506001600160a01b038216906396e35cea9062000721908f908f908d9030908e908e9060040162001c48565b600060405180830381600087803b1580156200073c57600080fd5b505af115801562000751573d6000803e3d6000fd5b5050505060038860405162000767919062001bf3565b90815260405190819003602001902054620007c357600580546001810182556000919091528851620007c1917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208b019062001659565b505b620007cf858b620003fd565b8815620007e257620007e2858a62000a7d565b600388604051620007f4919062001bf3565b908152604051602091819003820181208054600181018255600091825292902090910180546001600160a01b0319166001600160a01b03881617905560029062000840908f9062001bf3565b9081526040516020918190038201812080546001810182556000918252908390200180546001600160a01b0319166001600160a01b03891690811790915581527f607dd1c5b5447c9bd5a6d83ea5b7aeeb40f4090e1363840bd8cf024eb33f86e2910160405180910390a15050505098975050505050505050565b6000600282604051620008cf919062001bf3565b9081526040519081900360200190205492915050565b60606004805480602002602001604051908101604052809291908181526020016000905b82821015620009bf5783829060005260206000200180546200092b9062001cad565b80601f0160208091040260200160405190810160405280929190818152602001828054620009599062001cad565b8015620009aa5780601f106200097e57610100808354040283529160200191620009aa565b820191906000526020600020905b8154815290600101906020018083116200098c57829003601f168201915b50505050508152602001906001019062000909565b50505050905090565b60058181548110620009d957600080fd5b906000526020600020016000915090508054620009f69062001cad565b80601f016020809104026020016040519081016040528092919081815260200182805462000a249062001cad565b801562000a755780601f1062000a495761010080835404028352916020019162000a75565b820191906000526020600020905b81548152906001019060200180831162000a5757829003601f168201915b505050505081565b6000546201000090046001600160a01b0316331462000ab05760405162461bcd60e51b8152600401620004309062001bcd565b60405163160e3f3d60e01b8152600481018290526001600160a01b0383169063160e3f3d9060240162000508565b6000546201000090046001600160a01b0316331462000b115760405162461bcd60e51b8152600401620004309062001bcd565b62000b1c81620014ff565b50565b60005b92915050565b815160208184018101805160028252928201918501919091209190528054829081106200056c57600080fd5b600062000b626001620015b6565b9050801562000b7b576000805461ff0019166101001790555b62000b8682620014ff565b801562000bcd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600062000be16008600a62001dfd565b905090565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015620009bf57838290600052602060002001805462000c2c9062001cad565b80601f016020809104026020016040519081016040528092919081815260200182805462000c5a9062001cad565b801562000cab5780601f1062000c7f5761010080835404028352916020019162000cab565b820191906000526020600020905b81548152906001019060200180831162000c8d57829003601f168201915b50505050508152602001906001019062000c0a565b60048181548110620009d957600080fd5b6000600382604051620008cf919062001bf3565b6000546201000090046001600160a01b0316331462000d185760405162461bcd60e51b8152600401620004309062001bcd565b60006001600160a01b03166001858560405162000d3792919062001e0b565b908152604051908190036020019020546001600160a01b0316141562000d98576004805460018101825560009190915262000d96907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018585620016e8565b505b7fe562b1204ef3c8cf86ddccbb5b4fe6ca6cea7d4c1721e54d179f2b76720be1668484846001888860405162000dd092919062001e0b565b9081526040519081900360200181205462000dfa949392916001600160a01b039091169062001e1b565b60405180910390a1816001858560405162000e1792919062001e0b565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790558062000e525762000f39565b60005b6002858560405162000e6992919062001e0b565b9081526040519081900360200190205481101562000f37576002858560405162000e9592919062001e0b565b9081526020016040518091039020818154811062000eb75762000eb762001e62565b600091825260209091200154604051631b2ce7f360e11b81526001600160a01b03858116600483015290911690633659cfe690602401600060405180830381600087803b15801562000f0857600080fd5b505af115801562000f1d573d6000803e3d6000fd5b50505050808062000f2e9062001e78565b91505062000e55565b505b50505050565b6000546201000090046001600160a01b0316331462000f725760405162461bcd60e51b8152600401620004309062001bcd565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000fae57600080fd5b505afa15801562000fc3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fe9919062001e96565b1115620010395760405162461bcd60e51b815260206004820152601860248201527f426f6e64466163746f72793a2043414e545f52454d4f56450000000000000000604482015260640162000430565b6000816001600160a01b03166304baa00b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200107757600080fd5b505af11580156200108c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620010b6919081019062001eb0565b90506000826001600160a01b031663f12d870f6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620010f657600080fd5b505af11580156200110b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001135919081019062001eb0565b90506000839050600060028460405162001150919062001bf3565b90815260405190819003602001902054905060005b81811015620012f357826001600160a01b03166002866040516200118a919062001bf3565b90815260200160405180910390208281548110620011ac57620011ac62001e62565b6000918252602090912001546001600160a01b031614620011cd57620012de565b600285604051620011df919062001bf3565b908152604051908190036020019020620011fb60018462001f27565b815481106200120e576200120e62001e62565b6000918252602090912001546040516001600160a01b03909116906002906200123990889062001bf3565b908152602001604051809103902082815481106200125b576200125b62001e62565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002856040516200129b919062001bf3565b9081526020016040518091039020805480620012bb57620012bb62001f41565b600082815260209020810160001990810180546001600160a01b03191690550190555b80620012ea8162001e78565b91505062001165565b50600060038460405162001308919062001bf3565b90815260405190819003602001902054905060005b81811015620014ab57836001600160a01b031660038660405162001342919062001bf3565b9081526020016040518091039020828154811062001364576200136462001e62565b6000918252602090912001546001600160a01b031614620013855762001496565b60038560405162001397919062001bf3565b908152604051908190036020019020620013b360018462001f27565b81548110620013c657620013c662001e62565b6000918252602090912001546040516001600160a01b0390911690600390620013f190889062001bf3565b9081526020016040518091039020828154811062001413576200141362001e62565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060038560405162001453919062001bf3565b908152602001604051809103902080548062001473576200147362001f41565b600082815260209020810160001990810180546001600160a01b03191690550190555b80620014a28162001e78565b9150506200131d565b506040516001600160a01b03841681527fff88a3b6ae790816ff4f385e4c1acba5a2f5abd3972c4a3c99aa212d8a46f6c39060200160405180910390a1505050505050565b6001600160a01b03163b151590565b6001600160a01b038116620015615760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b606482015260840162000430565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff161562001602578160ff166001148015620015db5750303b155b620015fa5760405162461bcd60e51b8152600401620004309062001f57565b506000919050565b60005460ff8084169116106200162c5760405162461bcd60e51b8152600401620004309062001f57565b506000805460ff191660ff92909216919091179055600190565b919050565b610eca8062001fa683390190565b828054620016679062001cad565b90600052602060002090601f0160209004810192826200168b5760008555620016d6565b82601f10620016a657805160ff1916838001178555620016d6565b82800160010185558215620016d6579182015b82811115620016d6578251825591602001919060010190620016b9565b50620016e492915062001765565b5090565b828054620016f69062001cad565b90600052602060002090601f0160209004810192826200171a5760008555620016d6565b82601f10620017355782800160ff19823516178555620016d6565b82800160010185558215620016d6579182015b82811115620016d657823582559160200191906001019062001748565b5b80821115620016e4576000815560010162001766565b6001600160a01b038116811462000b1c57600080fd5b60008060408385031215620017a657600080fd5b8235620017b3816200177c565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715620018035762001803620017c1565b604052919050565b600067ffffffffffffffff821115620018285762001828620017c1565b50601f01601f191660200190565b600082601f8301126200184857600080fd5b81356200185f62001859826200180b565b620017d7565b8181528460208386010111156200187557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215620018a657600080fd5b823567ffffffffffffffff811115620018be57600080fd5b620018cc8582860162001836565b95602094909401359450505050565b803562001646816200177c565b600080600080600080600080610100898b0312156200190657600080fd5b883567ffffffffffffffff808211156200191f57600080fd5b6200192d8c838d0162001836565b995060208b01359150808211156200194457600080fd5b620019528c838d0162001836565b985060408b01359150808211156200196957600080fd5b620019778c838d0162001836565b975060608b0135965060808b0135955060a08b01359150808211156200199c57600080fd5b50620019ab8b828c0162001836565b935050620019bc60c08a01620018db565b915060e089013590509295985092959890939650565b600060208284031215620019e557600080fd5b813567ffffffffffffffff811115620019fd57600080fd5b62001a0b8482850162001836565b949350505050565b60006020828403121562001a2657600080fd5b813562001a33816200177c565b9392505050565b60005b8381101562001a5757818101518382015260200162001a3d565b8381111562000f395750506000910152565b6000815180845262001a8381602086016020860162001a3a565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101562001af057603f1988860301845262001add85835162001a69565b9450928501929085019060010162001abe565b5092979650505050505050565b60006020828403121562001b1057600080fd5b5035919050565b60208152600062001a33602083018462001a69565b6000806000806060858703121562001b4357600080fd5b843567ffffffffffffffff8082111562001b5c57600080fd5b818701915087601f83011262001b7157600080fd5b81358181111562001b8157600080fd5b88602082850101111562001b9457600080fd5b6020928301965094505085013562001bac816200177c565b91506040850135801515811462001bc257600080fd5b939692955090935050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6000825162001c0781846020870162001a3a565b9190910192915050565b6001600160a01b0384811682528316602082015260606040820181905260009062001c3f9083018462001a69565b95945050505050565b60c08152600062001c5d60c083018962001a69565b828103602084015262001c71818962001a69565b9050828103604084015262001c87818862001a69565b6001600160a01b0396871660608501529490951660808301525060a00152949350505050565b600181811c9082168062001cc257607f821691505b6020821081141562001ce457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562001d4157816000190482111562001d255762001d2562001cea565b8085161562001d3357918102915b93841c939080029062001d05565b509250929050565b60008262001d5a5750600162000b22565b8162001d695750600062000b22565b816001811462001d82576002811462001d8d5762001dad565b600191505062000b22565b60ff84111562001da15762001da162001cea565b50506001821b62000b22565b5060208310610133831016604e8410600b841016171562001dd2575081810a62000b22565b62001dde838362001d00565b806000190482111562001df55762001df562001cea565b029392505050565b600062001a33838362001d49565b8183823760009101908152919050565b6060815283606082015283856080830137600060808583018101919091526001600160a01b039384166020830152919092166040830152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b600060001982141562001e8f5762001e8f62001cea565b5060010190565b60006020828403121562001ea957600080fd5b5051919050565b60006020828403121562001ec357600080fd5b815167ffffffffffffffff81111562001edb57600080fd5b8201601f8101841362001eed57600080fd5b805162001efe62001859826200180b565b81815285602083850101111562001f1457600080fd5b62001c3f82602083016020860162001a3a565b60008282101562001f3c5762001f3c62001cea565b500390565b634e487b7160e01b600052603160045260246000fd5b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b60608201526080019056fe608060405260405162000eca38038062000eca83398101604081905262000026916200051f565b82828282816200005860017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd620005ff565b60008051602062000e838339815191521462000078576200007862000625565b6200008682826000620000ed565b50620000b6905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005ff565b60008051602062000e6383398151915214620000d657620000d662000625565b620000e1826200012a565b5050505050506200068e565b620000f88362000185565b600082511180620001065750805b156200012557620001238383620001c760201b620002581760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000155620001f6565b604080516001600160a01b03928316815291841660208301520160405180910390a162000182816200022f565b50565b6200019081620002e4565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060620001ef838360405180606001604052806027815260200162000ea36027913962000387565b9392505050565b60006200022060008051602062000e6383398151915260001b6200046d60201b620002001760201c565b546001600160a01b0316919050565b6001600160a01b0381166200029a5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002c360008051602062000e6383398151915260001b6200046d60201b620002001760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002fa816200047060201b620002841760201c565b6200035e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000291565b80620002c360008051602062000e8383398151915260001b6200046d60201b620002001760201c565b60606001600160a01b0384163b620003f15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840162000291565b600080856001600160a01b0316856040516200040e91906200063b565b600060405180830381855af49150503d80600081146200044b576040519150601f19603f3d011682016040523d82523d6000602084013e62000450565b606091505b509092509050620004638282866200047f565b9695505050505050565b90565b6001600160a01b03163b151590565b6060831562000490575081620001ef565b825115620004a15782518084602001fd5b8160405162461bcd60e51b815260040162000291919062000659565b80516001600160a01b0381168114620004d557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200050d578181015183820152602001620004f3565b83811115620001235750506000910152565b6000806000606084860312156200053557600080fd5b6200054084620004bd565b92506200055060208501620004bd565b60408501519092506001600160401b03808211156200056e57600080fd5b818601915086601f8301126200058357600080fd5b815181811115620005985762000598620004da565b604051601f8201601f19908116603f01168101908382118183101715620005c357620005c3620004da565b81604052828152896020848701011115620005dd57600080fd5b620005f0836020830160208801620004f0565b80955050505050509250925092565b6000828210156200062057634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b600082516200064f818460208701620004f0565b9190910192915050565b60208152600082518060208401526200067a816040850160208701620004f0565b601f01601f19169190910160400192915050565b6107c5806200069e6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b61008036600461064f565b610110565b61005b61009336600461066a565b610157565b3480156100a457600080fd5b506100ad6101c8565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e436600461064f565b610203565b3480156100f557600080fd5b506100ad61022d565b61010e610109610293565b61029d565b565b6101186102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c816040518060200160405280600081525060006102f4565b50565b61014c6100fe565b61015f6102c1565b6001600160a01b0316336001600160a01b031614156101c0576101bb8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506102f4915050565b505050565b6101bb6100fe565b60006101d26102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f3610293565b905090565b6102006100fe565b90565b61020b6102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c8161031f565b60006102376102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f36102c1565b606061027d838360405180606001604052806027815260200161076960279139610373565b9392505050565b6001600160a01b03163b151590565b60006101f3610455565b3660008037600080366000845af43d6000803e8080156102bc573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6102fd8361047d565b60008251118061030a5750805b156101bb576103198383610258565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103486102c1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014c816104bd565b60606001600160a01b0384163b6103e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516103fb9190610719565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044b828286610566565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102e5565b6104868161059f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105225760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d7565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561057557508161027d565b8251156105855782518084602001fd5b8160405162461bcd60e51b81526004016103d79190610735565b6001600160a01b0381163b61060c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016103d7565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610545565b80356001600160a01b038116811461064a57600080fd5b919050565b60006020828403121561066157600080fd5b61027d82610633565b60008060006040848603121561067f57600080fd5b61068884610633565b9250602084013567ffffffffffffffff808211156106a557600080fd5b818601915086601f8301126106b957600080fd5b8135818111156106c857600080fd5b8760208285010111156106da57600080fd5b6020830194508093505050509250925092565b60005b838110156107085781810151838201526020016106f0565b838111156103195750506000910152565b6000825161072b8184602087016106ed565b9190910192915050565b60208152600082518060208401526107548160408501602087016106ed565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9e1fbe41895f8bf7249337aca83abf16214aebbd0a1f744a3df3f57c9c8a4e264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122094cbffb2a4f5a069670414b01778a4573e5b7bf4c495938c3b992ce65a34cae564736f6c63430008090033496e697469616c697a61626c653a20636f6e747261637420697320616c726561", - "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620001745760003560e01c80637c33d3d811620000d3578063ef0cef6c1162000086578063ef0cef6c1462000350578063efc51bca1462000367578063f21c5563146200039e578063f851a44014620003b5578063f920ea5414620003cf578063fd5b909214620003e657600080fd5b80637c33d3d814620002cd578063b67afd8814620002e4578063c4d66de81462000307578063dfb2866d146200031e578063e988b66f1462000328578063ee01e5e7146200033257600080fd5b806341976e09116200012c57806341976e09146200021d5780636016338b14620002495780636141380214620002625780636370920e1462000288578063704b6c02146200029f57806373f7e98a14620002b657600080fd5b8062e4768b146200017957806305300b2814620001925780630f988f7014620001a857806326eb508514620001bf57806334b4fc7614620001ef578063381bac331462000206575b600080fd5b620001906200018a36600462001792565b620003fd565b005b60085b6040519081526020015b60405180910390f35b62000190620001b936600462001792565b620004a6565b620001d6620001d036600462001892565b62000540565b6040516001600160a01b0390911681526020016200019f565b620001d662000200366004620018e8565b62000588565b6200019562000217366004620019d2565b620008bb565b620001956200022e36600462001a13565b6001600160a01b031660009081526006602052604090205490565b62000253620008e5565b6040516200019f919062001a97565b620002796200027336600462001afd565b620009c8565b6040516200019f919062001b17565b620001906200029936600462001792565b62000a7d565b62000190620002b036600462001a13565b62000ade565b62000195620002c736600462001892565b62000b1f565b620001d6620002de36600462001892565b62000b28565b62000195620002f536600462001a13565b60066020526000908152604090205481565b620001906200031836600462001a13565b62000b54565b6200019562000bd1565b6200025362000be6565b6200033c61271081565b60405161ffff90911681526020016200019f565b620002796200036136600462001afd565b62000cc0565b620001d662000378366004620019d2565b80516020818301810180516001825292820191909301209152546001600160a01b031681565b62000195620003af366004620019d2565b62000cd1565b600054620001d6906201000090046001600160a01b031681565b62000190620003e036600462001b2c565b62000ce5565b62000190620003f736600462001a13565b62000f3f565b6000546201000090046001600160a01b03163314620004395760405162461bcd60e51b8152600401620004309062001bcd565b60405180910390fd5b6001600160a01b038216600081815260066020908152604091829020548251858152918201527fb556fac599c3c70efb9ab1fa725ecace6c81cc48d1455f886607def065f3e0c0910160405180910390a26001600160a01b03909116600090815260066020526040902055565b6000546201000090046001600160a01b03163314620004d95760405162461bcd60e51b8152600401620004309062001bcd565b604051633f78aea360e21b8152600481018290523360248201526001600160a01b0383169063fde2ba8c906044015b600060405180830381600087803b1580156200052357600080fd5b505af115801562000538573d6000803e3d6000fd5b505050505050565b815160208184018101805160038252928201918501919091209190528054829081106200056c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080546201000090046001600160a01b03163314620005bc5760405162461bcd60e51b8152600401620004309062001bcd565b6000309050600060018b604051620005d5919062001bf3565b908152604051908190036020019020546001600160a01b0316905080620006505760405162461bcd60e51b815260206004820152602860248201527f426f6e64466163746f72793a20496e76616c696420626f6e6420696d706c656d60448201526732b73a30ba34b7b760c11b606482015260840162000430565b60008811620006a25760405162461bcd60e51b815260206004820152601a60248201527f426f6e64466163746f72793a20494e56414c49445f5052494345000000000000604482015260640162000430565b60606000828483604051620006b7906200164b565b620006c59392919062001c11565b604051809103906000f080158015620006e2573d6000803e3d6000fd5b50604051634b71ae7560e11b81529095508591506001600160a01b038216906396e35cea9062000721908f908f908d9030908e908e9060040162001c48565b600060405180830381600087803b1580156200073c57600080fd5b505af115801562000751573d6000803e3d6000fd5b5050505060038860405162000767919062001bf3565b90815260405190819003602001902054620007c357600580546001810182556000919091528851620007c1917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208b019062001659565b505b620007cf858b620003fd565b8815620007e257620007e2858a62000a7d565b600388604051620007f4919062001bf3565b908152604051602091819003820181208054600181018255600091825292902090910180546001600160a01b0319166001600160a01b03881617905560029062000840908f9062001bf3565b9081526040516020918190038201812080546001810182556000918252908390200180546001600160a01b0319166001600160a01b03891690811790915581527f607dd1c5b5447c9bd5a6d83ea5b7aeeb40f4090e1363840bd8cf024eb33f86e2910160405180910390a15050505098975050505050505050565b6000600282604051620008cf919062001bf3565b9081526040519081900360200190205492915050565b60606004805480602002602001604051908101604052809291908181526020016000905b82821015620009bf5783829060005260206000200180546200092b9062001cad565b80601f0160208091040260200160405190810160405280929190818152602001828054620009599062001cad565b8015620009aa5780601f106200097e57610100808354040283529160200191620009aa565b820191906000526020600020905b8154815290600101906020018083116200098c57829003601f168201915b50505050508152602001906001019062000909565b50505050905090565b60058181548110620009d957600080fd5b906000526020600020016000915090508054620009f69062001cad565b80601f016020809104026020016040519081016040528092919081815260200182805462000a249062001cad565b801562000a755780601f1062000a495761010080835404028352916020019162000a75565b820191906000526020600020905b81548152906001019060200180831162000a5757829003601f168201915b505050505081565b6000546201000090046001600160a01b0316331462000ab05760405162461bcd60e51b8152600401620004309062001bcd565b60405163160e3f3d60e01b8152600481018290526001600160a01b0383169063160e3f3d9060240162000508565b6000546201000090046001600160a01b0316331462000b115760405162461bcd60e51b8152600401620004309062001bcd565b62000b1c81620014ff565b50565b60005b92915050565b815160208184018101805160028252928201918501919091209190528054829081106200056c57600080fd5b600062000b626001620015b6565b9050801562000b7b576000805461ff0019166101001790555b62000b8682620014ff565b801562000bcd576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600062000be16008600a62001dfd565b905090565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015620009bf57838290600052602060002001805462000c2c9062001cad565b80601f016020809104026020016040519081016040528092919081815260200182805462000c5a9062001cad565b801562000cab5780601f1062000c7f5761010080835404028352916020019162000cab565b820191906000526020600020905b81548152906001019060200180831162000c8d57829003601f168201915b50505050508152602001906001019062000c0a565b60048181548110620009d957600080fd5b6000600382604051620008cf919062001bf3565b6000546201000090046001600160a01b0316331462000d185760405162461bcd60e51b8152600401620004309062001bcd565b60006001600160a01b03166001858560405162000d3792919062001e0b565b908152604051908190036020019020546001600160a01b0316141562000d98576004805460018101825560009190915262000d96907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018585620016e8565b505b7fe562b1204ef3c8cf86ddccbb5b4fe6ca6cea7d4c1721e54d179f2b76720be1668484846001888860405162000dd092919062001e0b565b9081526040519081900360200181205462000dfa949392916001600160a01b039091169062001e1b565b60405180910390a1816001858560405162000e1792919062001e0b565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790558062000e525762000f39565b60005b6002858560405162000e6992919062001e0b565b9081526040519081900360200190205481101562000f37576002858560405162000e9592919062001e0b565b9081526020016040518091039020818154811062000eb75762000eb762001e62565b600091825260209091200154604051631b2ce7f360e11b81526001600160a01b03858116600483015290911690633659cfe690602401600060405180830381600087803b15801562000f0857600080fd5b505af115801562000f1d573d6000803e3d6000fd5b50505050808062000f2e9062001e78565b91505062000e55565b505b50505050565b6000546201000090046001600160a01b0316331462000f725760405162461bcd60e51b8152600401620004309062001bcd565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801562000fae57600080fd5b505afa15801562000fc3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fe9919062001e96565b1115620010395760405162461bcd60e51b815260206004820152601860248201527f426f6e64466163746f72793a2043414e545f52454d4f56450000000000000000604482015260640162000430565b6000816001600160a01b03166304baa00b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200107757600080fd5b505af11580156200108c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620010b6919081019062001eb0565b90506000826001600160a01b031663f12d870f6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620010f657600080fd5b505af11580156200110b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001135919081019062001eb0565b90506000839050600060028460405162001150919062001bf3565b90815260405190819003602001902054905060005b81811015620012f357826001600160a01b03166002866040516200118a919062001bf3565b90815260200160405180910390208281548110620011ac57620011ac62001e62565b6000918252602090912001546001600160a01b031614620011cd57620012de565b600285604051620011df919062001bf3565b908152604051908190036020019020620011fb60018462001f27565b815481106200120e576200120e62001e62565b6000918252602090912001546040516001600160a01b03909116906002906200123990889062001bf3565b908152602001604051809103902082815481106200125b576200125b62001e62565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506002856040516200129b919062001bf3565b9081526020016040518091039020805480620012bb57620012bb62001f41565b600082815260209020810160001990810180546001600160a01b03191690550190555b80620012ea8162001e78565b91505062001165565b50600060038460405162001308919062001bf3565b90815260405190819003602001902054905060005b81811015620014ab57836001600160a01b031660038660405162001342919062001bf3565b9081526020016040518091039020828154811062001364576200136462001e62565b6000918252602090912001546001600160a01b031614620013855762001496565b60038560405162001397919062001bf3565b908152604051908190036020019020620013b360018462001f27565b81548110620013c657620013c662001e62565b6000918252602090912001546040516001600160a01b0390911690600390620013f190889062001bf3565b9081526020016040518091039020828154811062001413576200141362001e62565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060038560405162001453919062001bf3565b908152602001604051809103902080548062001473576200147362001f41565b600082815260209020810160001990810180546001600160a01b03191690550190555b80620014a28162001e78565b9150506200131d565b506040516001600160a01b03841681527fff88a3b6ae790816ff4f385e4c1acba5a2f5abd3972c4a3c99aa212d8a46f6c39060200160405180910390a1505050505050565b6001600160a01b03163b151590565b6001600160a01b038116620015615760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b606482015260840162000430565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff161562001602578160ff166001148015620015db5750303b155b620015fa5760405162461bcd60e51b8152600401620004309062001f57565b506000919050565b60005460ff8084169116106200162c5760405162461bcd60e51b8152600401620004309062001f57565b506000805460ff191660ff92909216919091179055600190565b919050565b610eca8062001fa683390190565b828054620016679062001cad565b90600052602060002090601f0160209004810192826200168b5760008555620016d6565b82601f10620016a657805160ff1916838001178555620016d6565b82800160010185558215620016d6579182015b82811115620016d6578251825591602001919060010190620016b9565b50620016e492915062001765565b5090565b828054620016f69062001cad565b90600052602060002090601f0160209004810192826200171a5760008555620016d6565b82601f10620017355782800160ff19823516178555620016d6565b82800160010185558215620016d6579182015b82811115620016d657823582559160200191906001019062001748565b5b80821115620016e4576000815560010162001766565b6001600160a01b038116811462000b1c57600080fd5b60008060408385031215620017a657600080fd5b8235620017b3816200177c565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715620018035762001803620017c1565b604052919050565b600067ffffffffffffffff821115620018285762001828620017c1565b50601f01601f191660200190565b600082601f8301126200184857600080fd5b81356200185f62001859826200180b565b620017d7565b8181528460208386010111156200187557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215620018a657600080fd5b823567ffffffffffffffff811115620018be57600080fd5b620018cc8582860162001836565b95602094909401359450505050565b803562001646816200177c565b600080600080600080600080610100898b0312156200190657600080fd5b883567ffffffffffffffff808211156200191f57600080fd5b6200192d8c838d0162001836565b995060208b01359150808211156200194457600080fd5b620019528c838d0162001836565b985060408b01359150808211156200196957600080fd5b620019778c838d0162001836565b975060608b0135965060808b0135955060a08b01359150808211156200199c57600080fd5b50620019ab8b828c0162001836565b935050620019bc60c08a01620018db565b915060e089013590509295985092959890939650565b600060208284031215620019e557600080fd5b813567ffffffffffffffff811115620019fd57600080fd5b62001a0b8482850162001836565b949350505050565b60006020828403121562001a2657600080fd5b813562001a33816200177c565b9392505050565b60005b8381101562001a5757818101518382015260200162001a3d565b8381111562000f395750506000910152565b6000815180845262001a8381602086016020860162001a3a565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101562001af057603f1988860301845262001add85835162001a69565b9450928501929085019060010162001abe565b5092979650505050505050565b60006020828403121562001b1057600080fd5b5035919050565b60208152600062001a33602083018462001a69565b6000806000806060858703121562001b4357600080fd5b843567ffffffffffffffff8082111562001b5c57600080fd5b818701915087601f83011262001b7157600080fd5b81358181111562001b8157600080fd5b88602082850101111562001b9457600080fd5b6020928301965094505085013562001bac816200177c565b91506040850135801515811462001bc257600080fd5b939692955090935050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b6000825162001c0781846020870162001a3a565b9190910192915050565b6001600160a01b0384811682528316602082015260606040820181905260009062001c3f9083018462001a69565b95945050505050565b60c08152600062001c5d60c083018962001a69565b828103602084015262001c71818962001a69565b9050828103604084015262001c87818862001a69565b6001600160a01b0396871660608501529490951660808301525060a00152949350505050565b600181811c9082168062001cc257607f821691505b6020821081141562001ce457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562001d4157816000190482111562001d255762001d2562001cea565b8085161562001d3357918102915b93841c939080029062001d05565b509250929050565b60008262001d5a5750600162000b22565b8162001d695750600062000b22565b816001811462001d82576002811462001d8d5762001dad565b600191505062000b22565b60ff84111562001da15762001da162001cea565b50506001821b62000b22565b5060208310610133831016604e8410600b841016171562001dd2575081810a62000b22565b62001dde838362001d00565b806000190482111562001df55762001df562001cea565b029392505050565b600062001a33838362001d49565b8183823760009101908152919050565b6060815283606082015283856080830137600060808583018101919091526001600160a01b039384166020830152919092166040830152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b600060001982141562001e8f5762001e8f62001cea565b5060010190565b60006020828403121562001ea957600080fd5b5051919050565b60006020828403121562001ec357600080fd5b815167ffffffffffffffff81111562001edb57600080fd5b8201601f8101841362001eed57600080fd5b805162001efe62001859826200180b565b81815285602083850101111562001f1457600080fd5b62001c3f82602083016020860162001a3a565b60008282101562001f3c5762001f3c62001cea565b500390565b634e487b7160e01b600052603160045260246000fd5b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b60608201526080019056fe608060405260405162000eca38038062000eca83398101604081905262000026916200051f565b82828282816200005860017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd620005ff565b60008051602062000e838339815191521462000078576200007862000625565b6200008682826000620000ed565b50620000b6905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005ff565b60008051602062000e6383398151915214620000d657620000d662000625565b620000e1826200012a565b5050505050506200068e565b620000f88362000185565b600082511180620001065750805b156200012557620001238383620001c760201b620002581760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000155620001f6565b604080516001600160a01b03928316815291841660208301520160405180910390a162000182816200022f565b50565b6200019081620002e4565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060620001ef838360405180606001604052806027815260200162000ea36027913962000387565b9392505050565b60006200022060008051602062000e6383398151915260001b6200046d60201b620002001760201c565b546001600160a01b0316919050565b6001600160a01b0381166200029a5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002c360008051602062000e6383398151915260001b6200046d60201b620002001760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002fa816200047060201b620002841760201c565b6200035e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000291565b80620002c360008051602062000e8383398151915260001b6200046d60201b620002001760201c565b60606001600160a01b0384163b620003f15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840162000291565b600080856001600160a01b0316856040516200040e91906200063b565b600060405180830381855af49150503d80600081146200044b576040519150601f19603f3d011682016040523d82523d6000602084013e62000450565b606091505b509092509050620004638282866200047f565b9695505050505050565b90565b6001600160a01b03163b151590565b6060831562000490575081620001ef565b825115620004a15782518084602001fd5b8160405162461bcd60e51b815260040162000291919062000659565b80516001600160a01b0381168114620004d557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200050d578181015183820152602001620004f3565b83811115620001235750506000910152565b6000806000606084860312156200053557600080fd5b6200054084620004bd565b92506200055060208501620004bd565b60408501519092506001600160401b03808211156200056e57600080fd5b818601915086601f8301126200058357600080fd5b815181811115620005985762000598620004da565b604051601f8201601f19908116603f01168101908382118183101715620005c357620005c3620004da565b81604052828152896020848701011115620005dd57600080fd5b620005f0836020830160208801620004f0565b80955050505050509250925092565b6000828210156200062057634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b600082516200064f818460208701620004f0565b9190910192915050565b60208152600082518060208401526200067a816040850160208701620004f0565b601f01601f19169190910160400192915050565b6107c5806200069e6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b61008036600461064f565b610110565b61005b61009336600461066a565b610157565b3480156100a457600080fd5b506100ad6101c8565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e436600461064f565b610203565b3480156100f557600080fd5b506100ad61022d565b61010e610109610293565b61029d565b565b6101186102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c816040518060200160405280600081525060006102f4565b50565b61014c6100fe565b61015f6102c1565b6001600160a01b0316336001600160a01b031614156101c0576101bb8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506102f4915050565b505050565b6101bb6100fe565b60006101d26102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f3610293565b905090565b6102006100fe565b90565b61020b6102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c8161031f565b60006102376102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f36102c1565b606061027d838360405180606001604052806027815260200161076960279139610373565b9392505050565b6001600160a01b03163b151590565b60006101f3610455565b3660008037600080366000845af43d6000803e8080156102bc573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6102fd8361047d565b60008251118061030a5750805b156101bb576103198383610258565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103486102c1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014c816104bd565b60606001600160a01b0384163b6103e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516103fb9190610719565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044b828286610566565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102e5565b6104868161059f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105225760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d7565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561057557508161027d565b8251156105855782518084602001fd5b8160405162461bcd60e51b81526004016103d79190610735565b6001600160a01b0381163b61060c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016103d7565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610545565b80356001600160a01b038116811461064a57600080fd5b919050565b60006020828403121561066157600080fd5b61027d82610633565b60008060006040848603121561067f57600080fd5b61068884610633565b9250602084013567ffffffffffffffff808211156106a557600080fd5b818601915086601f8301126106b957600080fd5b8135818111156106c857600080fd5b8760208285010111156106da57600080fd5b6020830194508093505050509250925092565b60005b838110156107085781810151838201526020016106f0565b838111156103195750506000910152565b6000825161072b8184602087016106ed565b9190910192915050565b60208152600082518060208401526107548160408501602087016106ed565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9e1fbe41895f8bf7249337aca83abf16214aebbd0a1f744a3df3f57c9c8a4e264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122094cbffb2a4f5a069670414b01778a4573e5b7bf4c495938c3b992ce65a34cae564736f6c63430008090033", + "numDeployments": 9, + "solcInputHash": "6a13f6e055440a5408c02b9e5d62636b", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"bondToken\",\"type\":\"address\"}],\"name\":\"BondCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"kind\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"}],\"name\":\"BondImplementationUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"bondToken\",\"type\":\"address\"}],\"name\":\"BondRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bondToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousPrice\",\"type\":\"uint256\"}],\"name\":\"PriceUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"PERCENTAGE_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"bondImplementations\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"bondKinds\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"bondPrices\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ask\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdated\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"bondSeries\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"tradingAmount\",\"type\":\"uint256\"}],\"name\":\"calculateFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ask\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdated\",\"type\":\"uint256\"}],\"internalType\":\"struct IBondFactory.BondPrice\",\"name\":\"initialPrice_\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"initialGrant_\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"series_\",\"type\":\"string\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"underlyingToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maturity_\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"isin_\",\"type\":\"string\"}],\"name\":\"createBond\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"bondTokenAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBondKinds\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBondSeries\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"}],\"name\":\"getKindBondLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"}],\"name\":\"getPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ask\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdated\",\"type\":\"uint256\"}],\"internalType\":\"struct IBondFactory.BondPrice\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"series_\",\"type\":\"string\"}],\"name\":\"getSeriesBondLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"grant\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"isinBondMapping\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"kindBondsMapping\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"priceDecimals\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"priceFactor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IBond\",\"name\":\"bondToken_\",\"type\":\"address\"}],\"name\":\"removeBond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"seriesBondsMapping\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"kind_\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"impl_\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"upgradeDeployed_\",\"type\":\"bool\"}],\"name\":\"setBondImplementation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ask\",\"type\":\"uint256\"}],\"name\":\"setPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bondToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"underlyingOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ask\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdated\",\"type\":\"uint256\"}],\"internalType\":\"struct IBondFactory.BondPrice\",\"name\":\"price\",\"type\":\"tuple\"}],\"name\":\"verifyPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ask\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdated\",\"type\":\"uint256\"}],\"internalType\":\"struct IBondFactory.BondPrice\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"}},\"stateVariables\":{\"PERCENTAGE_FACTOR\":{\"details\":\"factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%; Calculation formula: x * percentage / PERCENTAGE_FACTOR\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/BondFactory.sol\":\"BondFactory\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\\n * proxy whose upgrades are fully controlled by the current implementation.\\n */\\ninterface IERC1822Proxiable {\\n /**\\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\\n * address.\\n *\\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\\n * function revert if invoked through a proxy.\\n */\\n function proxiableUUID() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.sol\\\";\\n\\n/**\\n * @dev This abstract contract provides getters and event emitting update functions for\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\\n *\\n * _Available since v4.1._\\n *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\n // This is the keccak-256 hash of \\\"eip1967.proxy.rollback\\\" subtracted by 1\\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\\n\\n /**\\n * @dev Storage slot with the address of the current implementation.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.implementation\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 implementation slot.\\n */\\n function _setImplementation(address newImplementation) private {\\n require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n }\\n\\n /**\\n * @dev Perform implementation upgrade\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeTo(address newImplementation) internal {\\n _setImplementation(newImplementation);\\n emit Upgraded(newImplementation);\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCall(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(newImplementation, data);\\n }\\n }\\n\\n /**\\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\\n *\\n * Emits an {Upgraded} event.\\n */\\n function _upgradeToAndCallUUPS(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n // Upgrades from old implementations will perform a rollback test. This test requires the new\\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\\n // this special case will break upgrade paths from old UUPS implementation to new ones.\\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\\n require(slot == _IMPLEMENTATION_SLOT, \\\"ERC1967Upgrade: unsupported proxiableUUID\\\");\\n } catch {\\n revert(\\\"ERC1967Upgrade: new implementation is not UUPS\\\");\\n }\\n _upgradeToAndCall(newImplementation, data, forceCall);\\n }\\n }\\n\\n /**\\n * @dev Storage slot with the admin of the contract.\\n * This is the keccak-256 hash of \\\"eip1967.proxy.admin\\\" subtracted by 1, and is\\n * validated in the constructor.\\n */\\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @dev Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new address in the EIP1967 admin slot.\\n */\\n function _setAdmin(address newAdmin) private {\\n require(newAdmin != address(0), \\\"ERC1967: new admin is the zero address\\\");\\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n */\\n function _changeAdmin(address newAdmin) internal {\\n emit AdminChanged(_getAdmin(), newAdmin);\\n _setAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\\n */\\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\\n\\n /**\\n * @dev Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\\n }\\n\\n /**\\n * @dev Stores a new beacon in the EIP1967 beacon slot.\\n */\\n function _setBeacon(address newBeacon) private {\\n require(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(\\n Address.isContract(IBeacon(newBeacon).implementation()),\\n \\\"ERC1967: beacon implementation is not a contract\\\"\\n );\\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\\n }\\n\\n /**\\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\\n *\\n * Emits a {BeaconUpgraded} event.\\n */\\n function _upgradeBeaconToAndCall(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xabf3f59bc0e5423eae45e459dbe92e7052c6983628d39008590edc852a62f94a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overridden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xc130fe33f1b2132158531a87734153293f6d07bc263ff4ac90e85da9c82c0e27\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\\n */\\ninterface IBeacon {\\n /**\\n * @dev Must return an address that can be used as a delegate call target.\\n *\\n * {BeaconProxy} will check that this address is a contract.\\n */\\n function implementation() external view returns (address);\\n}\\n\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC1967/ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\\n * clashing], which can potentially be used in an attack, this contract uses the\\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\\n * things that go hand in hand:\\n *\\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\\n * that call matches one of the admin functions exposed by the proxy itself.\\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\\n * \\\"admin cannot fallback to proxy target\\\".\\n *\\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\\n * to sudden errors when trying to call a function from the proxy implementation.\\n *\\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\\n */\\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\\n /**\\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\\n */\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable ERC1967Proxy(_logic, _data) {\\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1));\\n _changeAdmin(admin_);\\n }\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function admin() external ifAdmin returns (address admin_) {\\n admin_ = _getAdmin();\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function implementation() external ifAdmin returns (address implementation_) {\\n implementation_ = _implementation();\\n }\\n\\n /**\\n * @dev Changes the admin of the proxy.\\n *\\n * Emits an {AdminChanged} event.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\\n */\\n function changeAdmin(address newAdmin) external virtual ifAdmin {\\n _changeAdmin(newAdmin);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\\n */\\n function upgradeTo(address newImplementation) external ifAdmin {\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\\n */\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\\n _upgradeToAndCall(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\\n */\\n function _beforeFallback() internal virtual override {\\n require(msg.sender != _getAdmin(), \\\"TransparentUpgradeableProxy: admin cannot fallback to proxy target\\\");\\n super._beforeFallback();\\n }\\n}\\n\",\"keccak256\":\"0x140055a64cf579d622e04f5a198595832bf2cb193cd0005f4f2d4d61ca906253\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2ccf9d2313a313d41a791505f2b5abfdc62191b5d4334f7f7a82691c088a1c87\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for reading and writing primitive types to specific storage slots.\\n *\\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\\n * This library helps with reading and writing to such slots without the need for inline assembly.\\n *\\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\\n *\\n * Example usage to set ERC1967 implementation slot:\\n * ```\\n * contract ERC1967 {\\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n *\\n * function _getImplementation() internal view returns (address) {\\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\\n * }\\n *\\n * function _setImplementation(address newImplementation) internal {\\n * require(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\\n * }\\n * }\\n * ```\\n *\\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\\n */\\nlibrary StorageSlot {\\n struct AddressSlot {\\n address value;\\n }\\n\\n struct BooleanSlot {\\n bool value;\\n }\\n\\n struct Bytes32Slot {\\n bytes32 value;\\n }\\n\\n struct Uint256Slot {\\n uint256 value;\\n }\\n\\n /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\\n */\\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\\n */\\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n\\n /**\\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\\n */\\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\\n assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"},\"contracts/BondFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n\\nimport \\\"./interfaces/IBondFactory.sol\\\";\\nimport \\\"./interfaces/IBond.sol\\\";\\nimport \\\"./libs/Adminable.sol\\\";\\nimport \\\"./libs/DuetTransparentUpgradeableProxy.sol\\\";\\n\\ncontract BondFactory is IBondFactory, Initializable, Adminable {\\n /**\\n * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%;\\n * Calculation formula: x * percentage / PERCENTAGE_FACTOR\\n */\\n uint16 public constant PERCENTAGE_FACTOR = 10000;\\n // kind => impl\\n mapping(string => address) public bondImplementations;\\n // kind => bond addresses\\n mapping(string => address[]) public kindBondsMapping;\\n // series => bond addresses\\n mapping(string => address[]) public seriesBondsMapping;\\n string[] public bondKinds;\\n string[] public bondSeries;\\n\\n // isin => bond address\\n mapping(string => address) public isinBondMapping;\\n\\n // bond => price\\n mapping(address => BondPrice) public bondPrices;\\n\\n event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice);\\n event BondImplementationUpdated(string kind, address implementation, address previousImplementation);\\n event BondCreated(address bondToken);\\n event BondRemoved(address bondToken);\\n\\n /// @custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n function initialize(address admin_) public initializer {\\n _setAdmin(admin_);\\n }\\n\\n function verifyPrice(BondPrice memory price) public view returns (BondPrice memory) {\\n require(\\n price.price > 0 && price.bid > 0 && price.ask > 0 && price.ask >= price.bid,\\n \\\"BondFactory: INVALID_PRICE\\\"\\n );\\n return price;\\n }\\n\\n function createBond(\\n string memory kind_,\\n string memory name_,\\n string memory symbol_,\\n BondPrice calldata initialPrice_,\\n uint256 initialGrant_,\\n string memory series_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_,\\n string memory isin_\\n ) external onlyAdmin returns (address bondTokenAddress) {\\n address proxyAdmin = address(this);\\n address bondImpl = bondImplementations[kind_];\\n require(bondImpl != address(0), \\\"BondFactory: Invalid bond implementation\\\");\\n require(isinBondMapping[isin_] == address(0), \\\"A bond for this isin already exists\\\");\\n verifyPrice(initialPrice_);\\n bytes memory proxyData;\\n DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData);\\n bondTokenAddress = address(proxy);\\n IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_, isin_);\\n isinBondMapping[isin_] = bondTokenAddress;\\n\\n if (seriesBondsMapping[series_].length == 0) {\\n bondSeries.push(series_);\\n }\\n setPrice(bondTokenAddress, initialPrice_.price, initialPrice_.bid, initialPrice_.ask);\\n if (initialGrant_ > 0) {\\n grant(bondTokenAddress, initialGrant_);\\n }\\n seriesBondsMapping[series_].push(bondTokenAddress);\\n kindBondsMapping[kind_].push(bondTokenAddress);\\n emit BondCreated(bondTokenAddress);\\n }\\n\\n function getBondKinds() external view returns (string[] memory) {\\n return bondKinds;\\n }\\n\\n function getKindBondLength(string memory kind_) external view returns (uint256) {\\n return kindBondsMapping[kind_].length;\\n }\\n\\n function getBondSeries() external view returns (string[] memory) {\\n return bondSeries;\\n }\\n\\n function getSeriesBondLength(string memory series_) external view returns (uint256) {\\n return seriesBondsMapping[series_].length;\\n }\\n\\n function setBondImplementation(\\n string calldata kind_,\\n address impl_,\\n bool upgradeDeployed_\\n ) external onlyAdmin {\\n if (bondImplementations[kind_] == address(0)) {\\n bondKinds.push(kind_);\\n }\\n emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]);\\n bondImplementations[kind_] = impl_;\\n if (!upgradeDeployed_) {\\n return;\\n }\\n for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) {\\n DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_);\\n }\\n }\\n\\n function setPrice(\\n address bondToken_,\\n uint256 price,\\n uint256 bid,\\n uint256 ask\\n ) public onlyAdmin {\\n emit PriceUpdated(bondToken_, price, bondPrices[bondToken_].price);\\n bondPrices[bondToken_] = BondPrice({ price: price, bid: bid, ask: ask, lastUpdated: block.timestamp });\\n }\\n\\n function getPrice(address bondToken_) public view returns (BondPrice memory) {\\n BondPrice memory price = bondPrices[bondToken_];\\n verifyPrice(price);\\n return price;\\n }\\n\\n function priceDecimals() public view returns (uint256) {\\n return 8;\\n }\\n\\n function priceFactor() public view returns (uint256) {\\n return 10**priceDecimals();\\n }\\n\\n function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin {\\n IBond(bondToken_).underlyingOut(amount_, msg.sender);\\n }\\n\\n function grant(address bondToken_, uint256 amount_) public onlyAdmin {\\n IBond(bondToken_).grant(amount_);\\n }\\n\\n function removeBond(IBond bondToken_) external onlyAdmin {\\n require(bondToken_.totalSupply() <= 0, \\\"BondFactory: CANT_REMOVE\\\");\\n string memory kind = bondToken_.kind();\\n string memory series = bondToken_.series();\\n address bondTokenAddress = address(bondToken_);\\n\\n uint256 kindBondLength = kindBondsMapping[kind].length;\\n for (uint256 i = 0; i < kindBondLength; i++) {\\n if (kindBondsMapping[kind][i] != bondTokenAddress) {\\n continue;\\n }\\n kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1];\\n kindBondsMapping[kind].pop();\\n break;\\n }\\n\\n uint256 seriesBondLength = seriesBondsMapping[series].length;\\n for (uint256 j = 0; j < seriesBondLength; j++) {\\n if (seriesBondsMapping[series][j] != bondTokenAddress) {\\n continue;\\n }\\n seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1];\\n seriesBondsMapping[series].pop();\\n break;\\n }\\n\\n delete isinBondMapping[bondToken_.isin()];\\n\\n emit BondRemoved(bondTokenAddress);\\n }\\n\\n function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) {\\n // TODO\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xeeb587f2981a53a9196e5f6718dad71a312bf5d0a2766b83a49dc6e3cd5392f0\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBond.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface IBond is IERC20Upgradeable {\\n function initialize(\\n string memory name_,\\n string memory symbol_,\\n string memory series,\\n address factory_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_,\\n string memory isin_\\n ) external;\\n\\n function kind() external returns (string memory);\\n\\n function series() external returns (string memory);\\n\\n function isin() external returns (string memory);\\n\\n function underlyingOut(uint256 amount_, address to_) external;\\n\\n function grant(uint256 amount_) external;\\n\\n function faceValue(uint256 bondAmount_) external view returns (uint256);\\n\\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xe62bb491085455e9fdfff5f7be1b910a84c827d350eee7ba0b75b517ff440b76\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBondFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\ninterface IBondFactory {\\n struct BondPrice {\\n uint256 price;\\n uint256 bid;\\n uint256 ask;\\n uint256 lastUpdated;\\n }\\n\\n function priceFactor() external view returns (uint256);\\n\\n function getPrice(address bondToken_) external view returns (BondPrice memory price);\\n}\\n\",\"keccak256\":\"0xa790c14699d29d50822772d6f03aef5a2f31e27b161bda85ebc0736369eeba02\",\"license\":\"GPL-3.0\"},\"contracts/libs/Adminable.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nabstract contract Adminable {\\n event AdminUpdated(address indexed user, address indexed newAdmin);\\n\\n address public admin;\\n\\n modifier onlyAdmin() virtual {\\n require(msg.sender == admin, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n function setAdmin(address newAdmin) public virtual onlyAdmin {\\n _setAdmin(newAdmin);\\n }\\n\\n function _setAdmin(address newAdmin) internal {\\n require(newAdmin != address(0), \\\"Can not set admin to zero address\\\");\\n admin = newAdmin;\\n\\n emit AdminUpdated(msg.sender, newAdmin);\\n }\\n}\\n\",\"keccak256\":\"0xe47c97c0e3edad2d1df3e664376a7bb46e1aaf51b4c4acc73c4a2cfdc747185f\",\"license\":\"GPL-3.0\"},\"contracts/libs/DuetTransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\nimport \\\"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\\\";\\n\\ncontract DuetTransparentUpgradeableProxy is TransparentUpgradeableProxy {\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {}\\n\\n /**\\n * @dev override parent behavior to manage bonds fully in Factory\\n *\\n */\\n function _beforeFallback() internal virtual override {}\\n}\\n\",\"keccak256\":\"0xe59f85b113777531c6519e0cd2bedbc35844ca809a153b10a9f17840042978b1\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506200001c62000022565b62000152565b6200002e60ff62000031565b50565b60008054610100900460ff1615620000ca578160ff1660011480156200006a575062000068306200014360201b620018b51760201c565b155b620000c25760405162461bcd60e51b815260206004820152602e6024820152600080516020620034d483398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff808416911610620001295760405162461bcd60e51b815260206004820152602e6024820152600080516020620034d483398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000b9565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b61337280620001626000396000f3fe60806040523480156200001157600080fd5b5060043610620001af5760003560e01c8063b67afd8811620000f0578063ee01e5e711620000a3578063f21c5563116200007a578063f21c5563146200047c578063f851a4401462000493578063f920ea5414620004ad578063fd5b909214620004c457600080fd5b8063ee01e5e71462000410578063ef0cef6c146200042e578063efc51bca146200044557600080fd5b8063b67afd88146200033e578063c4d66de81462000397578063dfb2866d14620003ae578063e44c8c1b14620003b8578063e804c9f614620003cf578063e988b66f146200040657600080fd5b80636016338b1162000166578063704b6c02116200013d578063704b6c0214620002e257806373f7e98a14620002f95780637c33d3d8146200031057806380a4f74c146200032757600080fd5b80636016338b146200028c5780636141380214620002a55780636370920e14620002cb57600080fd5b80630450d53e14620001b457806305300b2814620001cd5780630f988f7014620001e357806326eb508514620001fa578063381bac33146200022a57806341976e091462000241575b600080fd5b620001cb620001c536600462001b53565b620004db565b005b60085b6040519081526020015b60405180910390f35b620001cb620001f436600462001b91565b620005bc565b620002116200020b36600462001c91565b62000656565b6040516001600160a01b039091168152602001620001da565b620001d06200023b36600462001cda565b6200069e565b620002586200025236600462001d1b565b620006c8565b604051620001da91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6200029662000751565b604051620001da919062001d9f565b620002bc620002b636600462001e05565b62000834565b604051620001da919062001e1f565b620001cb620002dc36600462001b91565b620008e9565b620001cb620002f336600462001d1b565b6200094a565b620001d06200030a36600462001c91565b6200098b565b620002116200032136600462001c91565b62000994565b620002116200033836600462001e5a565b620009c0565b620003766200034f36600462001d1b565b60076020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001620001da565b620001cb620003a836600462001d1b565b62000db1565b620001d062000e2e565b62000258620003c936600462001f79565b62000e43565b62000211620003e036600462001cda565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6200029662000efc565b6200041a61271081565b60405161ffff9091168152602001620001da565b620002bc6200043f36600462001e05565b62000fd6565b620002116200045636600462001cda565b80516020818301810180516001825292820191909301209152546001600160a01b031681565b620001d06200048d36600462001cda565b62000fe7565b60005462000211906201000090046001600160a01b031681565b620001cb620004be36600462001fe3565b62000ffb565b620001cb620004d536600462001d1b565b62001255565b6000546201000090046001600160a01b03163314620005175760405162461bcd60e51b81526004016200050e9062002084565b60405180910390fd5b6001600160a01b038416600081815260076020908152604091829020548251878152918201527fb556fac599c3c70efb9ab1fa725ecace6c81cc48d1455f886607def065f3e0c0910160405180910390a260408051608081018252938452602080850193845284820192835242606086019081526001600160a01b03909616600090815260079091522092518355905160018301555160028201559051600390910155565b6000546201000090046001600160a01b03163314620005ef5760405162461bcd60e51b81526004016200050e9062002084565b604051633f78aea360e21b8152600481018290523360248201526001600160a01b0383169063fde2ba8c906044015b600060405180830381600087803b1580156200063957600080fd5b505af11580156200064e573d6000803e3d6000fd5b505050505050565b815160208184018101805160038252928201918501919091209190528054829081106200068257600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000600282604051620006b29190620020aa565b9081526040519081900360200190205492915050565b620006f46040518060800160405280600081526020016000815260200160008152602001600081525090565b6001600160a01b03821660009081526007602090815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460608201526200074a8162000e43565b5092915050565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156200082b5783829060005260206000200180546200079790620020c8565b80601f0160208091040260200160405190810160405280929190818152602001828054620007c590620020c8565b8015620008165780601f10620007ea5761010080835404028352916020019162000816565b820191906000526020600020905b815481529060010190602001808311620007f857829003601f168201915b50505050508152602001906001019062000775565b50505050905090565b600581815481106200084557600080fd5b9060005260206000200160009150905080546200086290620020c8565b80601f01602080910402602001604051908101604052809291908181526020018280546200089090620020c8565b8015620008e15780601f10620008b557610100808354040283529160200191620008e1565b820191906000526020600020905b815481529060010190602001808311620008c357829003601f168201915b505050505081565b6000546201000090046001600160a01b031633146200091c5760405162461bcd60e51b81526004016200050e9062002084565b60405163160e3f3d60e01b8152600481018290526001600160a01b0383169063160e3f3d906024016200061e565b6000546201000090046001600160a01b031633146200097d5760405162461bcd60e51b81526004016200050e9062002084565b6200098881620018c4565b50565b60005b92915050565b815160208184018101805160028252928201918501919091209190528054829081106200068257600080fd5b600080546201000090046001600160a01b03163314620009f45760405162461bcd60e51b81526004016200050e9062002084565b6000309050600060018c60405162000a0d9190620020aa565b908152604051908190036020019020546001600160a01b031690508062000a885760405162461bcd60e51b815260206004820152602860248201527f426f6e64466163746f72793a20496e76616c696420626f6e6420696d706c656d60448201526732b73a30ba34b7b760c11b60648201526084016200050e565b60006001600160a01b031660068560405162000aa59190620020aa565b908152604051908190036020019020546001600160a01b03161462000b195760405162461bcd60e51b815260206004820152602360248201527f4120626f6e6420666f722074686973206973696e20616c72656164792065786960448201526273747360e81b60648201526084016200050e565b62000b2e620003c9368b90038b018b62001f79565b506060600082848360405162000b449062001a10565b62000b5293929190620020ff565b604051809103906000f08015801562000b6f573d6000803e3d6000fd5b509050809450846001600160a01b031663df776b2d8e8e8c308d8d8d6040518863ffffffff1660e01b815260040162000baf979695949392919062002136565b600060405180830381600087803b15801562000bca57600080fd5b505af115801562000bdf573d6000803e3d6000fd5b505050508460068760405162000bf69190620020aa565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b03199093169290921790915560039062000c36908b90620020aa565b9081526040519081900360200190205462000c925760058054600181018255600091909152895162000c90917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208c019062001a1e565b505b62000ca9858c3560208e013560408f0135620004db565b891562000cbc5762000cbc858b620008e9565b60038960405162000cce9190620020aa565b9081526020016040518091039020859080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555060028e60405162000d359190620020aa565b9081526040516020918190038201812080546001810182556000918252908390200180546001600160a01b0319166001600160a01b03891690811790915581527f607dd1c5b5447c9bd5a6d83ea5b7aeeb40f4090e1363840bd8cf024eb33f86e2910160405180910390a1505050509998505050505050505050565b600062000dbf60016200197b565b9050801562000dd8576000805461ff0019166101001790555b62000de382620018c4565b801562000e2a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600062000e3e6008600a620022ca565b905090565b62000e6f6040518060800160405280600081526020016000815260200160008152602001600081525090565b81511580159062000e84575060008260200151115b801562000e95575060008260400151115b801562000eaa57508160200151826040015110155b62000ef85760405162461bcd60e51b815260206004820152601a60248201527f426f6e64466163746f72793a20494e56414c49445f505249434500000000000060448201526064016200050e565b5090565b60606005805480602002602001604051908101604052809291908181526020016000905b828210156200082b57838290600052602060002001805462000f4290620020c8565b80601f016020809104026020016040519081016040528092919081815260200182805462000f7090620020c8565b801562000fc15780601f1062000f955761010080835404028352916020019162000fc1565b820191906000526020600020905b81548152906001019060200180831162000fa357829003601f168201915b50505050508152602001906001019062000f20565b600481815481106200084557600080fd5b6000600382604051620006b29190620020aa565b6000546201000090046001600160a01b031633146200102e5760405162461bcd60e51b81526004016200050e9062002084565b60006001600160a01b0316600185856040516200104d929190620022d8565b908152604051908190036020019020546001600160a01b03161415620010ae5760048054600181018255600091909152620010ac907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01858562001aa9565b505b7fe562b1204ef3c8cf86ddccbb5b4fe6ca6cea7d4c1721e54d179f2b76720be16684848460018888604051620010e6929190620022d8565b9081526040519081900360200181205462001110949392916001600160a01b0390911690620022e8565b60405180910390a181600185856040516200112d929190620022d8565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790558062001168576200124f565b60005b600285856040516200117f929190620022d8565b908152604051908190036020019020548110156200124d5760028585604051620011ab929190620022d8565b90815260200160405180910390208181548110620011cd57620011cd6200232f565b600091825260209091200154604051631b2ce7f360e11b81526001600160a01b03858116600483015290911690633659cfe690602401600060405180830381600087803b1580156200121e57600080fd5b505af115801562001233573d6000803e3d6000fd5b505050508080620012449062002345565b9150506200116b565b505b50505050565b6000546201000090046001600160a01b03163314620012885760405162461bcd60e51b81526004016200050e9062002084565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015620012c457600080fd5b505afa158015620012d9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012ff919062002363565b11156200134f5760405162461bcd60e51b815260206004820152601860248201527f426f6e64466163746f72793a2043414e545f52454d4f5645000000000000000060448201526064016200050e565b6000816001600160a01b03166304baa00b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200138d57600080fd5b505af1158015620013a2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620013cc91908101906200237d565b90506000826001600160a01b031663f12d870f6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200140c57600080fd5b505af115801562001421573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200144b91908101906200237d565b905060008390506000600284604051620014669190620020aa565b90815260405190819003602001902054905060005b818110156200160e57826001600160a01b0316600286604051620014a09190620020aa565b90815260200160405180910390208281548110620014c257620014c26200232f565b6000918252602090912001546001600160a01b031614620014e357620015f9565b600285604051620014f59190620020aa565b90815260405190819003602001902062001511600184620023f4565b815481106200152457620015246200232f565b6000918252602090912001546040516001600160a01b03909116906002906200154f908890620020aa565b908152602001604051809103902082815481106200157157620015716200232f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600285604051620015b19190620020aa565b9081526020016040518091039020805480620015d157620015d16200240e565b600082815260209020810160001990810180546001600160a01b03191690550190556200160e565b80620016058162002345565b9150506200147b565b506000600384604051620016239190620020aa565b90815260405190819003602001902054905060005b81811015620017cb57836001600160a01b03166003866040516200165d9190620020aa565b908152602001604051809103902082815481106200167f576200167f6200232f565b6000918252602090912001546001600160a01b031614620016a057620017b6565b600385604051620016b29190620020aa565b908152604051908190036020019020620016ce600184620023f4565b81548110620016e157620016e16200232f565b6000918252602090912001546040516001600160a01b03909116906003906200170c908890620020aa565b908152602001604051809103902082815481106200172e576200172e6200232f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506003856040516200176e9190620020aa565b90815260200160405180910390208054806200178e576200178e6200240e565b600082815260209020810160001990810180546001600160a01b0319169055019055620017cb565b80620017c28162002345565b91505062001638565b506006866001600160a01b03166382d5a60d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200180a57600080fd5b505af11580156200181f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200184991908101906200237d565b604051620018589190620020aa565b9081526040516020918190038201812080546001600160a01b03191690556001600160a01b03851681527fff88a3b6ae790816ff4f385e4c1acba5a2f5abd3972c4a3c99aa212d8a46f6c3910160405180910390a1505050505050565b6001600160a01b03163b151590565b6001600160a01b038116620019265760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b60648201526084016200050e565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff1615620019c7578160ff166001148015620019a05750303b155b620019bf5760405162461bcd60e51b81526004016200050e9062002424565b506000919050565b60005460ff808416911610620019f15760405162461bcd60e51b81526004016200050e9062002424565b506000805460ff191660ff92909216919091179055600190565b919050565b610eca806200247383390190565b82805462001a2c90620020c8565b90600052602060002090601f01602090048101928262001a50576000855562001a9b565b82601f1062001a6b57805160ff191683800117855562001a9b565b8280016001018555821562001a9b579182015b8281111562001a9b57825182559160200191906001019062001a7e565b5062000ef892915062001b26565b82805462001ab790620020c8565b90600052602060002090601f01602090048101928262001adb576000855562001a9b565b82601f1062001af65782800160ff1982351617855562001a9b565b8280016001018555821562001a9b579182015b8281111562001a9b57823582559160200191906001019062001b09565b5b8082111562000ef8576000815560010162001b27565b6001600160a01b03811681146200098857600080fd5b6000806000806080858703121562001b6a57600080fd5b843562001b778162001b3d565b966020860135965060408601359560600135945092505050565b6000806040838503121562001ba557600080fd5b823562001bb28162001b3d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562001c025762001c0262001bc0565b604052919050565b600067ffffffffffffffff82111562001c275762001c2762001bc0565b50601f01601f191660200190565b600082601f83011262001c4757600080fd5b813562001c5e62001c588262001c0a565b62001bd6565b81815284602083860101111562001c7457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121562001ca557600080fd5b823567ffffffffffffffff81111562001cbd57600080fd5b62001ccb8582860162001c35565b95602094909401359450505050565b60006020828403121562001ced57600080fd5b813567ffffffffffffffff81111562001d0557600080fd5b62001d138482850162001c35565b949350505050565b60006020828403121562001d2e57600080fd5b813562001d3b8162001b3d565b9392505050565b60005b8381101562001d5f57818101518382015260200162001d45565b838111156200124f5750506000910152565b6000815180845262001d8b81602086016020860162001d42565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101562001df857603f1988860301845262001de585835162001d71565b9450928501929085019060010162001dc6565b5092979650505050505050565b60006020828403121562001e1857600080fd5b5035919050565b60208152600062001d3b602083018462001d71565b60006080828403121562001e4757600080fd5b50919050565b803562001a0b8162001b3d565b60008060008060008060008060006101808a8c03121562001e7a57600080fd5b893567ffffffffffffffff8082111562001e9357600080fd5b62001ea18d838e0162001c35565b9a5060208c013591508082111562001eb857600080fd5b62001ec68d838e0162001c35565b995060408c013591508082111562001edd57600080fd5b62001eeb8d838e0162001c35565b985062001efc8d60608e0162001e34565b975060e08c013596506101008c013591508082111562001f1b57600080fd5b62001f298d838e0162001c35565b955062001f3a6101208d0162001e4d565b94506101408c013593506101608c013591508082111562001f5a57600080fd5b5062001f698c828d0162001c35565b9150509295985092959850929598565b60006080828403121562001f8c57600080fd5b6040516080810181811067ffffffffffffffff8211171562001fb25762001fb262001bc0565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b6000806000806060858703121562001ffa57600080fd5b843567ffffffffffffffff808211156200201357600080fd5b818701915087601f8301126200202857600080fd5b8135818111156200203857600080fd5b8860208285010111156200204b57600080fd5b60209283019650945050850135620020638162001b3d565b9150604085013580151581146200207957600080fd5b939692955090935050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60008251620020be81846020870162001d42565b9190910192915050565b600181811c90821680620020dd57607f821691505b6020821081141562001e4757634e487b7160e01b600052602260045260246000fd5b6001600160a01b038481168252831660208201526060604082018190526000906200212d9083018462001d71565b95945050505050565b60e0815260006200214b60e083018a62001d71565b82810360208401526200215f818a62001d71565b9050828103604084015262002175818962001d71565b6001600160a01b0388811660608601528716608085015260a0840186905283810360c08501529050620021a9818562001d71565b9a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200220e578160001904821115620021f257620021f2620021b7565b808516156200220057918102915b93841c9390800290620021d2565b509250929050565b60008262002227575060016200098e565b8162002236575060006200098e565b81600181146200224f57600281146200225a576200227a565b60019150506200098e565b60ff8411156200226e576200226e620021b7565b50506001821b6200098e565b5060208310610133831016604e8410600b84101617156200229f575081810a6200098e565b620022ab8383620021cd565b8060001904821115620022c257620022c2620021b7565b029392505050565b600062001d3b838362002216565b8183823760009101908152919050565b6060815283606082015283856080830137600060808583018101919091526001600160a01b039384166020830152919092166040830152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200235c576200235c620021b7565b5060010190565b6000602082840312156200237657600080fd5b5051919050565b6000602082840312156200239057600080fd5b815167ffffffffffffffff811115620023a857600080fd5b8201601f81018413620023ba57600080fd5b8051620023cb62001c588262001c0a565b818152856020838501011115620023e157600080fd5b6200212d82602083016020860162001d42565b600082821015620024095762002409620021b7565b500390565b634e487b7160e01b600052603160045260246000fd5b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b60608201526080019056fe608060405260405162000eca38038062000eca83398101604081905262000026916200051f565b82828282816200005860017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd620005ff565b60008051602062000e838339815191521462000078576200007862000625565b6200008682826000620000ed565b50620000b6905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005ff565b60008051602062000e6383398151915214620000d657620000d662000625565b620000e1826200012a565b5050505050506200068e565b620000f88362000185565b600082511180620001065750805b156200012557620001238383620001c760201b620002581760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000155620001f6565b604080516001600160a01b03928316815291841660208301520160405180910390a162000182816200022f565b50565b6200019081620002e4565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060620001ef838360405180606001604052806027815260200162000ea36027913962000387565b9392505050565b60006200022060008051602062000e6383398151915260001b6200046d60201b620002001760201c565b546001600160a01b0316919050565b6001600160a01b0381166200029a5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002c360008051602062000e6383398151915260001b6200046d60201b620002001760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002fa816200047060201b620002841760201c565b6200035e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000291565b80620002c360008051602062000e8383398151915260001b6200046d60201b620002001760201c565b60606001600160a01b0384163b620003f15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840162000291565b600080856001600160a01b0316856040516200040e91906200063b565b600060405180830381855af49150503d80600081146200044b576040519150601f19603f3d011682016040523d82523d6000602084013e62000450565b606091505b509092509050620004638282866200047f565b9695505050505050565b90565b6001600160a01b03163b151590565b6060831562000490575081620001ef565b825115620004a15782518084602001fd5b8160405162461bcd60e51b815260040162000291919062000659565b80516001600160a01b0381168114620004d557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200050d578181015183820152602001620004f3565b83811115620001235750506000910152565b6000806000606084860312156200053557600080fd5b6200054084620004bd565b92506200055060208501620004bd565b60408501519092506001600160401b03808211156200056e57600080fd5b818601915086601f8301126200058357600080fd5b815181811115620005985762000598620004da565b604051601f8201601f19908116603f01168101908382118183101715620005c357620005c3620004da565b81604052828152896020848701011115620005dd57600080fd5b620005f0836020830160208801620004f0565b80955050505050509250925092565b6000828210156200062057634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b600082516200064f818460208701620004f0565b9190910192915050565b60208152600082518060208401526200067a816040850160208701620004f0565b601f01601f19169190910160400192915050565b6107c5806200069e6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b61008036600461064f565b610110565b61005b61009336600461066a565b610157565b3480156100a457600080fd5b506100ad6101c8565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e436600461064f565b610203565b3480156100f557600080fd5b506100ad61022d565b61010e610109610293565b61029d565b565b6101186102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c816040518060200160405280600081525060006102f4565b50565b61014c6100fe565b61015f6102c1565b6001600160a01b0316336001600160a01b031614156101c0576101bb8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506102f4915050565b505050565b6101bb6100fe565b60006101d26102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f3610293565b905090565b6102006100fe565b90565b61020b6102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c8161031f565b60006102376102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f36102c1565b606061027d838360405180606001604052806027815260200161076960279139610373565b9392505050565b6001600160a01b03163b151590565b60006101f3610455565b3660008037600080366000845af43d6000803e8080156102bc573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6102fd8361047d565b60008251118061030a5750805b156101bb576103198383610258565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103486102c1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014c816104bd565b60606001600160a01b0384163b6103e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516103fb9190610719565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044b828286610566565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102e5565b6104868161059f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105225760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d7565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561057557508161027d565b8251156105855782518084602001fd5b8160405162461bcd60e51b81526004016103d79190610735565b6001600160a01b0381163b61060c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016103d7565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610545565b80356001600160a01b038116811461064a57600080fd5b919050565b60006020828403121561066157600080fd5b61027d82610633565b60008060006040848603121561067f57600080fd5b61068884610633565b9250602084013567ffffffffffffffff808211156106a557600080fd5b818601915086601f8301126106b957600080fd5b8135818111156106c857600080fd5b8760208285010111156106da57600080fd5b6020830194508093505050509250925092565b60005b838110156107085781810151838201526020016106f0565b838111156103195750506000910152565b6000825161072b8184602087016106ed565b9190910192915050565b60208152600082518060208401526107548160408501602087016106ed565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9e1fbe41895f8bf7249337aca83abf16214aebbd0a1f744a3df3f57c9c8a4e264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220f32d533117001fbd247139ee3d0bed1ef03feb487c8a1cdcc92f8a7ceb3e165f64736f6c63430008090033496e697469616c697a61626c653a20636f6e747261637420697320616c726561", + "deployedBytecode": "0x60806040523480156200001157600080fd5b5060043610620001af5760003560e01c8063b67afd8811620000f0578063ee01e5e711620000a3578063f21c5563116200007a578063f21c5563146200047c578063f851a4401462000493578063f920ea5414620004ad578063fd5b909214620004c457600080fd5b8063ee01e5e71462000410578063ef0cef6c146200042e578063efc51bca146200044557600080fd5b8063b67afd88146200033e578063c4d66de81462000397578063dfb2866d14620003ae578063e44c8c1b14620003b8578063e804c9f614620003cf578063e988b66f146200040657600080fd5b80636016338b1162000166578063704b6c02116200013d578063704b6c0214620002e257806373f7e98a14620002f95780637c33d3d8146200031057806380a4f74c146200032757600080fd5b80636016338b146200028c5780636141380214620002a55780636370920e14620002cb57600080fd5b80630450d53e14620001b457806305300b2814620001cd5780630f988f7014620001e357806326eb508514620001fa578063381bac33146200022a57806341976e091462000241575b600080fd5b620001cb620001c536600462001b53565b620004db565b005b60085b6040519081526020015b60405180910390f35b620001cb620001f436600462001b91565b620005bc565b620002116200020b36600462001c91565b62000656565b6040516001600160a01b039091168152602001620001da565b620001d06200023b36600462001cda565b6200069e565b620002586200025236600462001d1b565b620006c8565b604051620001da91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6200029662000751565b604051620001da919062001d9f565b620002bc620002b636600462001e05565b62000834565b604051620001da919062001e1f565b620001cb620002dc36600462001b91565b620008e9565b620001cb620002f336600462001d1b565b6200094a565b620001d06200030a36600462001c91565b6200098b565b620002116200032136600462001c91565b62000994565b620002116200033836600462001e5a565b620009c0565b620003766200034f36600462001d1b565b60076020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001620001da565b620001cb620003a836600462001d1b565b62000db1565b620001d062000e2e565b62000258620003c936600462001f79565b62000e43565b62000211620003e036600462001cda565b80516020818301810180516006825292820191909301209152546001600160a01b031681565b6200029662000efc565b6200041a61271081565b60405161ffff9091168152602001620001da565b620002bc6200043f36600462001e05565b62000fd6565b620002116200045636600462001cda565b80516020818301810180516001825292820191909301209152546001600160a01b031681565b620001d06200048d36600462001cda565b62000fe7565b60005462000211906201000090046001600160a01b031681565b620001cb620004be36600462001fe3565b62000ffb565b620001cb620004d536600462001d1b565b62001255565b6000546201000090046001600160a01b03163314620005175760405162461bcd60e51b81526004016200050e9062002084565b60405180910390fd5b6001600160a01b038416600081815260076020908152604091829020548251878152918201527fb556fac599c3c70efb9ab1fa725ecace6c81cc48d1455f886607def065f3e0c0910160405180910390a260408051608081018252938452602080850193845284820192835242606086019081526001600160a01b03909616600090815260079091522092518355905160018301555160028201559051600390910155565b6000546201000090046001600160a01b03163314620005ef5760405162461bcd60e51b81526004016200050e9062002084565b604051633f78aea360e21b8152600481018290523360248201526001600160a01b0383169063fde2ba8c906044015b600060405180830381600087803b1580156200063957600080fd5b505af11580156200064e573d6000803e3d6000fd5b505050505050565b815160208184018101805160038252928201918501919091209190528054829081106200068257600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000600282604051620006b29190620020aa565b9081526040519081900360200190205492915050565b620006f46040518060800160405280600081526020016000815260200160008152602001600081525090565b6001600160a01b03821660009081526007602090815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460608201526200074a8162000e43565b5092915050565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156200082b5783829060005260206000200180546200079790620020c8565b80601f0160208091040260200160405190810160405280929190818152602001828054620007c590620020c8565b8015620008165780601f10620007ea5761010080835404028352916020019162000816565b820191906000526020600020905b815481529060010190602001808311620007f857829003601f168201915b50505050508152602001906001019062000775565b50505050905090565b600581815481106200084557600080fd5b9060005260206000200160009150905080546200086290620020c8565b80601f01602080910402602001604051908101604052809291908181526020018280546200089090620020c8565b8015620008e15780601f10620008b557610100808354040283529160200191620008e1565b820191906000526020600020905b815481529060010190602001808311620008c357829003601f168201915b505050505081565b6000546201000090046001600160a01b031633146200091c5760405162461bcd60e51b81526004016200050e9062002084565b60405163160e3f3d60e01b8152600481018290526001600160a01b0383169063160e3f3d906024016200061e565b6000546201000090046001600160a01b031633146200097d5760405162461bcd60e51b81526004016200050e9062002084565b6200098881620018c4565b50565b60005b92915050565b815160208184018101805160028252928201918501919091209190528054829081106200068257600080fd5b600080546201000090046001600160a01b03163314620009f45760405162461bcd60e51b81526004016200050e9062002084565b6000309050600060018c60405162000a0d9190620020aa565b908152604051908190036020019020546001600160a01b031690508062000a885760405162461bcd60e51b815260206004820152602860248201527f426f6e64466163746f72793a20496e76616c696420626f6e6420696d706c656d60448201526732b73a30ba34b7b760c11b60648201526084016200050e565b60006001600160a01b031660068560405162000aa59190620020aa565b908152604051908190036020019020546001600160a01b03161462000b195760405162461bcd60e51b815260206004820152602360248201527f4120626f6e6420666f722074686973206973696e20616c72656164792065786960448201526273747360e81b60648201526084016200050e565b62000b2e620003c9368b90038b018b62001f79565b506060600082848360405162000b449062001a10565b62000b5293929190620020ff565b604051809103906000f08015801562000b6f573d6000803e3d6000fd5b509050809450846001600160a01b031663df776b2d8e8e8c308d8d8d6040518863ffffffff1660e01b815260040162000baf979695949392919062002136565b600060405180830381600087803b15801562000bca57600080fd5b505af115801562000bdf573d6000803e3d6000fd5b505050508460068760405162000bf69190620020aa565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b03199093169290921790915560039062000c36908b90620020aa565b9081526040519081900360200190205462000c925760058054600181018255600091909152895162000c90917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208c019062001a1e565b505b62000ca9858c3560208e013560408f0135620004db565b891562000cbc5762000cbc858b620008e9565b60038960405162000cce9190620020aa565b9081526020016040518091039020859080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b0316021790555060028e60405162000d359190620020aa565b9081526040516020918190038201812080546001810182556000918252908390200180546001600160a01b0319166001600160a01b03891690811790915581527f607dd1c5b5447c9bd5a6d83ea5b7aeeb40f4090e1363840bd8cf024eb33f86e2910160405180910390a1505050509998505050505050505050565b600062000dbf60016200197b565b9050801562000dd8576000805461ff0019166101001790555b62000de382620018c4565b801562000e2a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b600062000e3e6008600a620022ca565b905090565b62000e6f6040518060800160405280600081526020016000815260200160008152602001600081525090565b81511580159062000e84575060008260200151115b801562000e95575060008260400151115b801562000eaa57508160200151826040015110155b62000ef85760405162461bcd60e51b815260206004820152601a60248201527f426f6e64466163746f72793a20494e56414c49445f505249434500000000000060448201526064016200050e565b5090565b60606005805480602002602001604051908101604052809291908181526020016000905b828210156200082b57838290600052602060002001805462000f4290620020c8565b80601f016020809104026020016040519081016040528092919081815260200182805462000f7090620020c8565b801562000fc15780601f1062000f955761010080835404028352916020019162000fc1565b820191906000526020600020905b81548152906001019060200180831162000fa357829003601f168201915b50505050508152602001906001019062000f20565b600481815481106200084557600080fd5b6000600382604051620006b29190620020aa565b6000546201000090046001600160a01b031633146200102e5760405162461bcd60e51b81526004016200050e9062002084565b60006001600160a01b0316600185856040516200104d929190620022d8565b908152604051908190036020019020546001600160a01b03161415620010ae5760048054600181018255600091909152620010ac907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01858562001aa9565b505b7fe562b1204ef3c8cf86ddccbb5b4fe6ca6cea7d4c1721e54d179f2b76720be16684848460018888604051620010e6929190620022d8565b9081526040519081900360200181205462001110949392916001600160a01b0390911690620022e8565b60405180910390a181600185856040516200112d929190620022d8565b90815260405190819003602001902080546001600160a01b03929092166001600160a01b03199092169190911790558062001168576200124f565b60005b600285856040516200117f929190620022d8565b908152604051908190036020019020548110156200124d5760028585604051620011ab929190620022d8565b90815260200160405180910390208181548110620011cd57620011cd6200232f565b600091825260209091200154604051631b2ce7f360e11b81526001600160a01b03858116600483015290911690633659cfe690602401600060405180830381600087803b1580156200121e57600080fd5b505af115801562001233573d6000803e3d6000fd5b505050508080620012449062002345565b9150506200116b565b505b50505050565b6000546201000090046001600160a01b03163314620012885760405162461bcd60e51b81526004016200050e9062002084565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015620012c457600080fd5b505afa158015620012d9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012ff919062002363565b11156200134f5760405162461bcd60e51b815260206004820152601860248201527f426f6e64466163746f72793a2043414e545f52454d4f5645000000000000000060448201526064016200050e565b6000816001600160a01b03166304baa00b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200138d57600080fd5b505af1158015620013a2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620013cc91908101906200237d565b90506000826001600160a01b031663f12d870f6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200140c57600080fd5b505af115801562001421573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200144b91908101906200237d565b905060008390506000600284604051620014669190620020aa565b90815260405190819003602001902054905060005b818110156200160e57826001600160a01b0316600286604051620014a09190620020aa565b90815260200160405180910390208281548110620014c257620014c26200232f565b6000918252602090912001546001600160a01b031614620014e357620015f9565b600285604051620014f59190620020aa565b90815260405190819003602001902062001511600184620023f4565b815481106200152457620015246200232f565b6000918252602090912001546040516001600160a01b03909116906002906200154f908890620020aa565b908152602001604051809103902082815481106200157157620015716200232f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600285604051620015b19190620020aa565b9081526020016040518091039020805480620015d157620015d16200240e565b600082815260209020810160001990810180546001600160a01b03191690550190556200160e565b80620016058162002345565b9150506200147b565b506000600384604051620016239190620020aa565b90815260405190819003602001902054905060005b81811015620017cb57836001600160a01b03166003866040516200165d9190620020aa565b908152602001604051809103902082815481106200167f576200167f6200232f565b6000918252602090912001546001600160a01b031614620016a057620017b6565b600385604051620016b29190620020aa565b908152604051908190036020019020620016ce600184620023f4565b81548110620016e157620016e16200232f565b6000918252602090912001546040516001600160a01b03909116906003906200170c908890620020aa565b908152602001604051809103902082815481106200172e576200172e6200232f565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506003856040516200176e9190620020aa565b90815260200160405180910390208054806200178e576200178e6200240e565b600082815260209020810160001990810180546001600160a01b0319169055019055620017cb565b80620017c28162002345565b91505062001638565b506006866001600160a01b03166382d5a60d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200180a57600080fd5b505af11580156200181f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200184991908101906200237d565b604051620018589190620020aa565b9081526040516020918190038201812080546001600160a01b03191690556001600160a01b03851681527fff88a3b6ae790816ff4f385e4c1acba5a2f5abd3972c4a3c99aa212d8a46f6c3910160405180910390a1505050505050565b6001600160a01b03163b151590565b6001600160a01b038116620019265760405162461bcd60e51b815260206004820152602160248201527f43616e206e6f74207365742061646d696e20746f207a65726f206164647265736044820152607360f81b60648201526084016200050e565b6000805462010000600160b01b031916620100006001600160a01b038416908102919091178255604051909133917f101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b9190a350565b60008054610100900460ff1615620019c7578160ff166001148015620019a05750303b155b620019bf5760405162461bcd60e51b81526004016200050e9062002424565b506000919050565b60005460ff808416911610620019f15760405162461bcd60e51b81526004016200050e9062002424565b506000805460ff191660ff92909216919091179055600190565b919050565b610eca806200247383390190565b82805462001a2c90620020c8565b90600052602060002090601f01602090048101928262001a50576000855562001a9b565b82601f1062001a6b57805160ff191683800117855562001a9b565b8280016001018555821562001a9b579182015b8281111562001a9b57825182559160200191906001019062001a7e565b5062000ef892915062001b26565b82805462001ab790620020c8565b90600052602060002090601f01602090048101928262001adb576000855562001a9b565b82601f1062001af65782800160ff1982351617855562001a9b565b8280016001018555821562001a9b579182015b8281111562001a9b57823582559160200191906001019062001b09565b5b8082111562000ef8576000815560010162001b27565b6001600160a01b03811681146200098857600080fd5b6000806000806080858703121562001b6a57600080fd5b843562001b778162001b3d565b966020860135965060408601359560600135945092505050565b6000806040838503121562001ba557600080fd5b823562001bb28162001b3d565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562001c025762001c0262001bc0565b604052919050565b600067ffffffffffffffff82111562001c275762001c2762001bc0565b50601f01601f191660200190565b600082601f83011262001c4757600080fd5b813562001c5e62001c588262001c0a565b62001bd6565b81815284602083860101111562001c7457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121562001ca557600080fd5b823567ffffffffffffffff81111562001cbd57600080fd5b62001ccb8582860162001c35565b95602094909401359450505050565b60006020828403121562001ced57600080fd5b813567ffffffffffffffff81111562001d0557600080fd5b62001d138482850162001c35565b949350505050565b60006020828403121562001d2e57600080fd5b813562001d3b8162001b3d565b9392505050565b60005b8381101562001d5f57818101518382015260200162001d45565b838111156200124f5750506000910152565b6000815180845262001d8b81602086016020860162001d42565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101562001df857603f1988860301845262001de585835162001d71565b9450928501929085019060010162001dc6565b5092979650505050505050565b60006020828403121562001e1857600080fd5b5035919050565b60208152600062001d3b602083018462001d71565b60006080828403121562001e4757600080fd5b50919050565b803562001a0b8162001b3d565b60008060008060008060008060006101808a8c03121562001e7a57600080fd5b893567ffffffffffffffff8082111562001e9357600080fd5b62001ea18d838e0162001c35565b9a5060208c013591508082111562001eb857600080fd5b62001ec68d838e0162001c35565b995060408c013591508082111562001edd57600080fd5b62001eeb8d838e0162001c35565b985062001efc8d60608e0162001e34565b975060e08c013596506101008c013591508082111562001f1b57600080fd5b62001f298d838e0162001c35565b955062001f3a6101208d0162001e4d565b94506101408c013593506101608c013591508082111562001f5a57600080fd5b5062001f698c828d0162001c35565b9150509295985092959850929598565b60006080828403121562001f8c57600080fd5b6040516080810181811067ffffffffffffffff8211171562001fb25762001fb262001bc0565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b6000806000806060858703121562001ffa57600080fd5b843567ffffffffffffffff808211156200201357600080fd5b818701915087601f8301126200202857600080fd5b8135818111156200203857600080fd5b8860208285010111156200204b57600080fd5b60209283019650945050850135620020638162001b3d565b9150604085013580151581146200207957600080fd5b939692955090935050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b60008251620020be81846020870162001d42565b9190910192915050565b600181811c90821680620020dd57607f821691505b6020821081141562001e4757634e487b7160e01b600052602260045260246000fd5b6001600160a01b038481168252831660208201526060604082018190526000906200212d9083018462001d71565b95945050505050565b60e0815260006200214b60e083018a62001d71565b82810360208401526200215f818a62001d71565b9050828103604084015262002175818962001d71565b6001600160a01b0388811660608601528716608085015260a0840186905283810360c08501529050620021a9818562001d71565b9a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200220e578160001904821115620021f257620021f2620021b7565b808516156200220057918102915b93841c9390800290620021d2565b509250929050565b60008262002227575060016200098e565b8162002236575060006200098e565b81600181146200224f57600281146200225a576200227a565b60019150506200098e565b60ff8411156200226e576200226e620021b7565b50506001821b6200098e565b5060208310610133831016604e8410600b84101617156200229f575081810a6200098e565b620022ab8383620021cd565b8060001904821115620022c257620022c2620021b7565b029392505050565b600062001d3b838362002216565b8183823760009101908152919050565b6060815283606082015283856080830137600060808583018101919091526001600160a01b039384166020830152919092166040830152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200235c576200235c620021b7565b5060010190565b6000602082840312156200237657600080fd5b5051919050565b6000602082840312156200239057600080fd5b815167ffffffffffffffff811115620023a857600080fd5b8201601f81018413620023ba57600080fd5b8051620023cb62001c588262001c0a565b818152856020838501011115620023e157600080fd5b6200212d82602083016020860162001d42565b600082821015620024095762002409620021b7565b500390565b634e487b7160e01b600052603160045260246000fd5b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b60608201526080019056fe608060405260405162000eca38038062000eca83398101604081905262000026916200051f565b82828282816200005860017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd620005ff565b60008051602062000e838339815191521462000078576200007862000625565b6200008682826000620000ed565b50620000b6905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104620005ff565b60008051602062000e6383398151915214620000d657620000d662000625565b620000e1826200012a565b5050505050506200068e565b620000f88362000185565b600082511180620001065750805b156200012557620001238383620001c760201b620002581760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f62000155620001f6565b604080516001600160a01b03928316815291841660208301520160405180910390a162000182816200022f565b50565b6200019081620002e4565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060620001ef838360405180606001604052806027815260200162000ea36027913962000387565b9392505050565b60006200022060008051602062000e6383398151915260001b6200046d60201b620002001760201c565b546001600160a01b0316919050565b6001600160a01b0381166200029a5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b80620002c360008051602062000e6383398151915260001b6200046d60201b620002001760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b620002fa816200047060201b620002841760201c565b6200035e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840162000291565b80620002c360008051602062000e8383398151915260001b6200046d60201b620002001760201c565b60606001600160a01b0384163b620003f15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840162000291565b600080856001600160a01b0316856040516200040e91906200063b565b600060405180830381855af49150503d80600081146200044b576040519150601f19603f3d011682016040523d82523d6000602084013e62000450565b606091505b509092509050620004638282866200047f565b9695505050505050565b90565b6001600160a01b03163b151590565b6060831562000490575081620001ef565b825115620004a15782518084602001fd5b8160405162461bcd60e51b815260040162000291919062000659565b80516001600160a01b0381168114620004d557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200050d578181015183820152602001620004f3565b83811115620001235750506000910152565b6000806000606084860312156200053557600080fd5b6200054084620004bd565b92506200055060208501620004bd565b60408501519092506001600160401b03808211156200056e57600080fd5b818601915086601f8301126200058357600080fd5b815181811115620005985762000598620004da565b604051601f8201601f19908116603f01168101908382118183101715620005c357620005c3620004da565b81604052828152896020848701011115620005dd57600080fd5b620005f0836020830160208801620004f0565b80955050505050509250925092565b6000828210156200062057634e487b7160e01b600052601160045260246000fd5b500390565b634e487b7160e01b600052600160045260246000fd5b600082516200064f818460208701620004f0565b9190910192915050565b60208152600082518060208401526200067a816040850160208701620004f0565b601f01601f19169190910160400192915050565b6107c5806200069e6000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b61008036600461064f565b610110565b61005b61009336600461066a565b610157565b3480156100a457600080fd5b506100ad6101c8565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e436600461064f565b610203565b3480156100f557600080fd5b506100ad61022d565b61010e610109610293565b61029d565b565b6101186102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c816040518060200160405280600081525060006102f4565b50565b61014c6100fe565b61015f6102c1565b6001600160a01b0316336001600160a01b031614156101c0576101bb8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506102f4915050565b505050565b6101bb6100fe565b60006101d26102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f3610293565b905090565b6102006100fe565b90565b61020b6102c1565b6001600160a01b0316336001600160a01b0316141561014f5761014c8161031f565b60006102376102c1565b6001600160a01b0316336001600160a01b031614156101f8576101f36102c1565b606061027d838360405180606001604052806027815260200161076960279139610373565b9392505050565b6001600160a01b03163b151590565b60006101f3610455565b3660008037600080366000845af43d6000803e8080156102bc573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6102fd8361047d565b60008251118061030a5750805b156101bb576103198383610258565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103486102c1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014c816104bd565b60606001600160a01b0384163b6103e05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084015b60405180910390fd5b600080856001600160a01b0316856040516103fb9190610719565b600060405180830381855af49150503d8060008114610436576040519150601f19603f3d011682016040523d82523d6000602084013e61043b565b606091505b509150915061044b828286610566565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102e5565b6104868161059f565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105225760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016103d7565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561057557508161027d565b8251156105855782518084602001fd5b8160405162461bcd60e51b81526004016103d79190610735565b6001600160a01b0381163b61060c5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016103d7565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610545565b80356001600160a01b038116811461064a57600080fd5b919050565b60006020828403121561066157600080fd5b61027d82610633565b60008060006040848603121561067f57600080fd5b61068884610633565b9250602084013567ffffffffffffffff808211156106a557600080fd5b818601915086601f8301126106b957600080fd5b8135818111156106c857600080fd5b8760208285010111156106da57600080fd5b6020830194508093505050509250925092565b60005b838110156107085781810151838201526020016106f0565b838111156103195750506000910152565b6000825161072b8184602087016106ed565b9190910192915050565b60208152600082518060208401526107548160408501602087016106ed565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c9e1fbe41895f8bf7249337aca83abf16214aebbd0a1f744a3df3f57c9c8a4e264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220f32d533117001fbd247139ee3d0bed1ef03feb487c8a1cdcc92f8a7ceb3e165f64736f6c63430008090033", "devdoc": { "kind": "dev", - "methods": {}, + "methods": { + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor" + } + }, "stateVariables": { "PERCENTAGE_FACTOR": { "details": "factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%; Calculation formula: x * percentage / PERCENTAGE_FACTOR" @@ -637,7 +784,7 @@ "type": "t_bool" }, { - "astId": 3778, + "astId": 3907, "contract": "contracts/BondFactory.sol:BondFactory", "label": "admin", "offset": 2, @@ -687,10 +834,18 @@ { "astId": 2538, "contract": "contracts/BondFactory.sol:BondFactory", - "label": "bondPrices", + "label": "isinBondMapping", "offset": 0, "slot": "6", - "type": "t_mapping(t_address,t_uint256)" + "type": "t_mapping(t_string_memory_ptr,t_address)" + }, + { + "astId": 2543, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "bondPrices", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_struct(BondPrice)3883_storage)" } ], "types": { @@ -716,12 +871,12 @@ "label": "bool", "numberOfBytes": "1" }, - "t_mapping(t_address,t_uint256)": { + "t_mapping(t_address,t_struct(BondPrice)3883_storage)": { "encoding": "mapping", "key": "t_address", - "label": "mapping(address => uint256)", + "label": "mapping(address => struct IBondFactory.BondPrice)", "numberOfBytes": "32", - "value": "t_uint256" + "value": "t_struct(BondPrice)3883_storage" }, "t_mapping(t_string_memory_ptr,t_address)": { "encoding": "mapping", @@ -747,6 +902,45 @@ "label": "string", "numberOfBytes": "32" }, + "t_struct(BondPrice)3883_storage": { + "encoding": "inplace", + "label": "struct IBondFactory.BondPrice", + "members": [ + { + "astId": 3876, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "price", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 3878, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "bid", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 3880, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "ask", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 3882, + "contract": "contracts/BondFactory.sol:BondFactory", + "label": "lastUpdated", + "offset": 0, + "slot": "3", + "type": "t_uint256" + } + ], + "numberOfBytes": "128" + }, "t_uint256": { "encoding": "inplace", "label": "uint256", diff --git a/packages/bonds/deployments/bsctest/DiscountBond.json b/packages/bonds/deployments/bsctest/DiscountBond.json index c50bdb0..4f87b39 100644 --- a/packages/bonds/deployments/bsctest/DiscountBond.json +++ b/packages/bonds/deployments/bsctest/DiscountBond.json @@ -1,5 +1,5 @@ { - "address": "0x8b90EF85FeAC96E7A2453FE14D5Cb331C2baD374", + "address": "0x1F158aF01DCF712048e843b36fD8320d69656A68", "abi": [ { "inputs": [], @@ -353,9 +353,31 @@ "name": "getPrice", "outputs": [ { - "internalType": "uint256", + "components": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "ask", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastUpdated", + "type": "uint256" + } + ], + "internalType": "struct IBondFactory.BondPrice", "name": "", - "type": "uint256" + "type": "tuple" } ], "stateMutability": "view", @@ -429,6 +451,11 @@ "internalType": "uint256", "name": "maturity_", "type": "uint256" + }, + { + "internalType": "string", + "name": "isin_", + "type": "string" } ], "name": "initialize", @@ -449,6 +476,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "isin", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "kind", @@ -780,41 +820,28 @@ "type": "function" } ], - "transactionHash": "0x3783086ac5181a6b97b0de64f21f9da3e9f65c6f6025e2941d978e9dd3dbb066", + "transactionHash": "0x69ff46141af1c89c0a1f8b12c8671fb5b4df87877fbb2131e3ba3caf7e7c8470", "receipt": { "to": null, "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", - "contractAddress": "0x8b90EF85FeAC96E7A2453FE14D5Cb331C2baD374", - "transactionIndex": 4, - "gasUsed": "1975262", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000010000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x83b0df5d6be26e9dd7a11d8cbe313911617e7c68c8148119812e154ebabc1ce5", - "transactionHash": "0x3783086ac5181a6b97b0de64f21f9da3e9f65c6f6025e2941d978e9dd3dbb066", - "logs": [ - { - "transactionIndex": 4, - "blockNumber": 24229784, - "transactionHash": "0x3783086ac5181a6b97b0de64f21f9da3e9f65c6f6025e2941d978e9dd3dbb066", - "address": "0x8b90EF85FeAC96E7A2453FE14D5Cb331C2baD374", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], - "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "logIndex": 6, - "blockHash": "0x83b0df5d6be26e9dd7a11d8cbe313911617e7c68c8148119812e154ebabc1ce5" - } - ], - "blockNumber": 24229784, - "cumulativeGasUsed": "6199426", + "contractAddress": "0x1F158aF01DCF712048e843b36fD8320d69656A68", + "transactionIndex": 9, + "gasUsed": "2075624", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1f5589c2bab12cf4277355b89999f65d150f463060a08456201a5f27571e3ef3", + "transactionHash": "0x69ff46141af1c89c0a1f8b12c8671fb5b4df87877fbb2131e3ba3caf7e7c8470", + "logs": [], + "blockNumber": 25186795, + "cumulativeGasUsed": "2597677", "status": 1, "byzantium": true }, "args": [], - "numDeployments": 8, - "solcInputHash": "86b5d7bad88174195e885f97b1fed94c", - "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"inventoryAmount\",\"type\":\"uint256\"}],\"name\":\"BondGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"name\":\"BondMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BondRedeemed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"name\":\"BondSold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MIN_TRADING_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"amountToUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"token_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"emergencyWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"faceValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"contract IBondFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"grant\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"series_\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"factory_\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"underlyingToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maturity_\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inventoryAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kind\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maturity\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"mintByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"underlyingAmount_\",\"type\":\"uint256\"}],\"name\":\"mintByUnderlyingAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"previewMintByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount_\",\"type\":\"uint256\"}],\"name\":\"previewMintByUnderlyingAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"previewSellByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"redeemFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"redeemedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"sellByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"series\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to_\",\"type\":\"address\"}],\"name\":\"underlyingOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlyingToken\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"grant(uint256)\":{\"details\":\"grant specific amount of bond for user mint.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DiscountBond.sol\":\"DiscountBond\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x041af89e5e60b74e1203d5a34614c9de379726f52ecb8cf064cab78b9fdcdf9d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"./extensions/IERC20MetadataUpgradeable.sol\\\";\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\\n __ERC20_init_unchained(name_, symbol_);\\n }\\n\\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[45] private __gap;\\n}\\n\",\"keccak256\":\"0xb71b875e7f1b8ad082eb6ff83bca4bfa7d050476cc98fd39295826b654edfb46\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x605434219ebbe4653f703640f06969faa5a1d78f0bfef878e5ddbb1ca369ceeb\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n function safeTransfer(\\n IERC20Upgradeable token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20Upgradeable token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3e26a49d2fa5ef8338b8a9467c91e54f417cb07e849b1cc0f4ebc4d2a147938e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"contracts/DiscountBond.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"./interfaces/IBond.sol\\\";\\nimport \\\"./interfaces/IBondFactory.sol\\\";\\n\\ncontract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n string public constant kind = \\\"Discount\\\";\\n uint256 public constant MIN_TRADING_AMOUNT = 1e12;\\n\\n IBondFactory public factory;\\n IERC20Upgradeable public underlyingToken;\\n uint256 public maturity;\\n string public series;\\n uint256 public inventoryAmount;\\n uint256 public redeemedAmount;\\n\\n event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\\n event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\\n event BondRedeemed(address indexed account, uint256 amount);\\n event BondGranted(uint256 amount, uint256 inventoryAmount);\\n\\n constructor() initializer {}\\n\\n function initialize(\\n string memory name_,\\n string memory symbol_,\\n string memory series_,\\n address factory_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_\\n ) external initializer {\\n __ERC20_init(name_, symbol_);\\n __ReentrancyGuard_init();\\n require(\\n maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days),\\n \\\"DiscountBond: INVALID_MATURITY\\\"\\n );\\n series = series_;\\n underlyingToken = underlyingToken_;\\n factory = IBondFactory(factory_);\\n maturity = maturity_;\\n }\\n\\n modifier beforeMaturity() {\\n require(block.timestamp < maturity, \\\"DiscountBond: MUST_BEFORE_MATURITY\\\");\\n _;\\n }\\n\\n modifier afterMaturity() {\\n require(block.timestamp >= maturity, \\\"DiscountBond: MUST_AFTER_MATURITY\\\");\\n _;\\n }\\n\\n modifier tradingGuard() {\\n require(getPrice() > 0, \\\"INVALID_PRICE\\\");\\n _;\\n }\\n\\n modifier onlyFactory() {\\n require(msg.sender == address(factory), \\\"DiscountBond: UNAUTHORIZED\\\");\\n _;\\n }\\n\\n /**\\n * @dev grant specific amount of bond for user mint.\\n */\\n function grant(uint256 amount_) external onlyFactory {\\n inventoryAmount += amount_;\\n emit BondGranted(amount_, inventoryAmount);\\n }\\n\\n function getPrice() public view returns (uint256) {\\n return factory.getPrice(address(this));\\n }\\n\\n function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_)\\n external\\n beforeMaturity\\n returns (uint256 bondAmount)\\n {\\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_);\\n bondAmount = previewMintByUnderlyingAmount(underlyingAmount_);\\n inventoryAmount -= bondAmount;\\n _mint(account_, bondAmount);\\n emit BondMinted(account_, bondAmount, underlyingAmount_);\\n }\\n\\n function previewMintByUnderlyingAmount(uint256 underlyingAmount_)\\n public\\n view\\n beforeMaturity\\n tradingGuard\\n returns (uint256 bondAmount)\\n {\\n require(underlyingAmount_ >= MIN_TRADING_AMOUNT, \\\"DiscountBond: AMOUNT_TOO_LOW\\\");\\n bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice();\\n require(inventoryAmount >= bondAmount, \\\"DiscountBond: INSUFFICIENT_LIQUIDITY\\\");\\n }\\n\\n function mintByBondAmount(address account_, uint256 bondAmount_)\\n external\\n beforeMaturity\\n returns (uint256 underlyingAmount)\\n {\\n underlyingAmount = previewMintByBondAmount(bondAmount_);\\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount);\\n inventoryAmount -= bondAmount_;\\n _mint(account_, bondAmount_);\\n emit BondMinted(account_, bondAmount_, underlyingAmount);\\n }\\n\\n function previewMintByBondAmount(uint256 bondAmount_)\\n public\\n view\\n beforeMaturity\\n tradingGuard\\n returns (uint256 underlyingAmount)\\n {\\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \\\"DiscountBond: AMOUNT_TOO_LOW\\\");\\n require(inventoryAmount >= bondAmount_, \\\"DiscountBond: INSUFFICIENT_LIQUIDITY\\\");\\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\\n }\\n\\n function sellByBondAmount(uint256 bondAmount_)\\n public\\n beforeMaturity\\n tradingGuard\\n returns (uint256 underlyingAmount)\\n {\\n underlyingAmount = previewSellByBondAmount(bondAmount_);\\n _burn(msg.sender, bondAmount_);\\n inventoryAmount += bondAmount_;\\n underlyingToken.safeTransfer(msg.sender, underlyingAmount);\\n emit BondSold(msg.sender, bondAmount_, underlyingAmount);\\n }\\n\\n function previewSellByBondAmount(uint256 bondAmount_)\\n public\\n view\\n beforeMaturity\\n tradingGuard\\n returns (uint256 underlyingAmount)\\n {\\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \\\"DiscountBond: AMOUNT_TOO_LOW\\\");\\n require(balanceOf(msg.sender) >= bondAmount_, \\\"DiscountBond: EXCEEDS_BALANCE\\\");\\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\\n require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, \\\"DiscountBond: INSUFFICIENT_LIQUIDITY\\\");\\n }\\n\\n function redeem(uint256 bondAmount_) public {\\n redeemFor(msg.sender, bondAmount_);\\n }\\n\\n function faceValue(uint256 bondAmount_) public view returns (uint256) {\\n return bondAmount_;\\n }\\n\\n function amountToUnderlying(uint256 bondAmount_) public view returns (uint256) {\\n if (block.timestamp >= maturity) {\\n return faceValue(bondAmount_);\\n }\\n return (bondAmount_ * getPrice()) / factory.priceFactor();\\n }\\n\\n function redeemFor(address account_, uint256 bondAmount_) public afterMaturity {\\n require(balanceOf(msg.sender) >= bondAmount_, \\\"DiscountBond: EXCEEDS_BALANCE\\\");\\n _burn(msg.sender, bondAmount_);\\n redeemedAmount += bondAmount_;\\n underlyingToken.safeTransfer(account_, bondAmount_);\\n emit BondRedeemed(account_, bondAmount_);\\n }\\n\\n /**\\n * @notice\\n */\\n function underlyingOut(uint256 amount_, address to_) external onlyFactory {\\n underlyingToken.safeTransfer(to_, amount_);\\n }\\n\\n function emergencyWithdraw(\\n IERC20Upgradeable token_,\\n address to_,\\n uint256 amount_\\n ) external onlyFactory {\\n token_.safeTransfer(to_, amount_);\\n }\\n}\\n\",\"keccak256\":\"0x41f040faf64c8bc5073db251b6bb0a5a50ecf3183232dc5277dcc641f6759771\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBond.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface IBond is IERC20Upgradeable {\\n function initialize(\\n string memory name_,\\n string memory symbol_,\\n string memory series,\\n address factory_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_\\n ) external;\\n\\n function kind() external returns (string memory);\\n\\n function series() external returns (string memory);\\n\\n function underlyingOut(uint256 amount_, address to_) external;\\n\\n function grant(uint256 amount_) external;\\n\\n function faceValue(uint256 bondAmount_) external view returns (uint256);\\n\\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x2e6653c949a3ae433a1e7ed6c7fd37b3886cd073be18d9c5e9402358cf36e8ff\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBondFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\ninterface IBondFactory {\\n function priceFactor() external view returns (uint256);\\n\\n function getPrice(address bondToken_) external view returns (uint256 price);\\n}\\n\",\"keccak256\":\"0x43ebf47455cddb545064cb42203f7973492dbf15c1e7204d5c0fefbd8aea8e23\",\"license\":\"GPL-3.0\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50600062000020600162000087565b9050801562000039576000805461ff0019166101001790555b801562000080576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50620001a8565b60008054610100900460ff161562000120578160ff166001148015620000c05750620000be306200019960201b620011c11760201c565b155b620001185760405162461bcd60e51b815260206004820152602e6024820152600080516020620023e083398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff8084169116106200017f5760405162461bcd60e51b815260206004820152602e6024820152600080516020620023e083398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016200010f565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b61222880620001b86000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c806395d89b411161011a578063c45a0155116100ad578063e63ea4081161007c578063e63ea40814610455578063f12d870f14610468578063fc48e64214610470578063fde2ba8c14610483578063fe8dbd8e1461049657600080fd5b8063c45a015514610409578063da7b038b1461041c578063db006a751461042f578063dd62ed3e1461044257600080fd5b8063a457c2d7116100e9578063a457c2d7146103c7578063a7731842146103da578063a9059cbb146103e3578063c0da2885146103f657600080fd5b806395d89b411461039157806396e35cea1461039957806398d5fdca146103ac57806398ecd688146103b457600080fd5b806323b872dd1161019d578063395093511161016c578063395093511461031c5780633ce896b81461032f5780634cb4bdc91461034257806370a08231146103555780637a82a1981461037e57600080fd5b806323b872dd146102c65780632491510a146102d95780632495a599146102e2578063313ce5671461030d57600080fd5b80630d6c2618116101d95780630d6c261814610294578063160e3f3d146102a057806318160ddd146102b5578063204f83f9146102bd57600080fd5b806304baa00b1461020b57806306d914061461024857806306fdde0314610269578063095ea7b314610271575b600080fd5b61023260405180604001604052806008815260200167111a5cd8dbdd5b9d60c21b81525081565b60405161023f9190611c82565b60405180910390f35b61025b610256366004611cca565b6104a7565b60405190815260200161023f565b610232610563565b61028461027f366004611cca565b6105f5565b604051901515815260200161023f565b61025b64e8d4a5100081565b6102b36102ae366004611cf6565b61060d565b005b60355461025b565b61025b60995481565b6102846102d4366004611d0f565b61068e565b61025b609b5481565b6098546102f5906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b6040516012815260200161023f565b61028461032a366004611cca565b6106b4565b61025b61033d366004611cca565b6106d6565b61025b610350366004611cf6565b610780565b61025b610363366004611d50565b6001600160a01b031660009081526033602052604090205490565b6102b361038c366004611cca565b610993565b610232610acd565b6102b36103a7366004611e10565b610adc565b61025b610c12565b61025b6103c2366004611cf6565b610c93565b6102846103d5366004611cca565b610d60565b61025b609c5481565b6102846103f1366004611cca565b610de6565b61025b610404366004611cf6565b610df4565b6097546102f5906001600160a01b031681565b61025b61042a366004611cf6565b610f2d565b6102b361043d366004611cf6565b610f3e565b61025b610450366004611ec8565b610f4b565b6102b3610463366004611d0f565b610f76565b610232610fb9565b61025b61047e366004611cf6565b611047565b6102b3610491366004611f01565b61117c565b61025b6104a4366004611cf6565b90565b600060995442106104d35760405162461bcd60e51b81526004016104ca90611f26565b60405180910390fd5b6098546104eb906001600160a01b03163330856111d0565b6104f482611047565b905080609b60008282546105089190611f7e565b9091555061051890508382611241565b60408051828152602081018490526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca91015b60405180910390a292915050565b60606036805461057290611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461059e90611f95565b80156105eb5780601f106105c0576101008083540402835291602001916105eb565b820191906000526020600020905b8154815290600101906020018083116105ce57829003601f168201915b5050505050905090565b600033610603818585611320565b5060019392505050565b6097546001600160a01b031633146106375760405162461bcd60e51b81526004016104ca90611fd0565b80609b60008282546106499190612007565b9091555050609b546040805183815260208101929092527f632d02909e5759576f4a85e32a3793720a7ca5319576cc41010c4217ddbad0e9910160405180910390a150565b60003361069c858285611444565b6106a78585856114b8565b60019150505b9392505050565b6000336106038185856106c78383610f4b565b6106d19190612007565b611320565b600060995442106106f95760405162461bcd60e51b81526004016104ca90611f26565b61070282610df4565b60985490915061071d906001600160a01b03163330846111d0565b81609b600082825461072f9190611f7e565b9091555061073f90508383611241565b60408051838152602081018390526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca9101610555565b600060995442106107a35760405162461bcd60e51b81526004016104ca90611f26565b60006107ad610c12565b116107ca5760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a510008210156107ef5760405162461bcd60e51b81526004016104ca90612046565b3360009081526033602052604090205482111561084e5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e434500000060448201526064016104ca565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561089c57600080fd5b505afa1580156108b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d4919061207d565b6108dc610c12565b6108e69084612096565b6108f091906120b5565b6098546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b15801561093857600080fd5b505afa15801561094c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610970919061207d565b101561098e5760405162461bcd60e51b81526004016104ca906120d7565b919050565b6099544210156109ef5760405162461bcd60e51b815260206004820152602160248201527f446973636f756e74426f6e643a204d5553545f41465445525f4d4154555249546044820152605960f81b60648201526084016104ca565b33600090815260336020526040902054811115610a4e5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e434500000060448201526064016104ca565b610a583382611686565b80609c6000828254610a6a9190612007565b9091555050609854610a86906001600160a01b031683836117d4565b816001600160a01b03167fbbb59c50b3cd05fe4982a9bc1fbab45bd421ac707f4fba6b080522e3a9cc03b382604051610ac191815260200190565b60405180910390a25050565b60606037805461057290611f95565b6000610ae86001611804565b90508015610b00576000805461ff0019166101001790555b610b0a878761188c565b610b126118bd565b4282118015610b2e5750610b2a426325980600612007565b8211155b610b7a5760405162461bcd60e51b815260206004820152601e60248201527f446973636f756e74426f6e643a20494e56414c49445f4d41545552495459000060448201526064016104ca565b8451610b8d90609a906020880190611bbd565b50609880546001600160a01b038086166001600160a01b031992831617909255609780549287169290911691909117905560998290558015610c09576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6097546040516341976e0960e01b81523060048201526000916001600160a01b0316906341976e099060240160206040518083038186803b158015610c5657600080fd5b505afa158015610c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8e919061207d565b905090565b60006099544210610cb65760405162461bcd60e51b81526004016104ca90611f26565b6000610cc0610c12565b11610cdd5760405162461bcd60e51b81526004016104ca9061201f565b610ce682610780565b9050610cf23383611686565b81609b6000828254610d049190612007565b9091555050609854610d20906001600160a01b031633836117d4565b604080518381526020810183905233917f3dbe987d8c318f20a1d550dd52db9a8a20cc25aab2f175c7ccafb306ee48d210910160405180910390a2919050565b60003381610d6e8286610f4b565b905083811015610dce5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104ca565b610ddb8286868403611320565b506001949350505050565b6000336106038185856114b8565b60006099544210610e175760405162461bcd60e51b81526004016104ca90611f26565b6000610e21610c12565b11610e3e5760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a51000821015610e635760405162461bcd60e51b81526004016104ca90612046565b81609b541015610e855760405162461bcd60e51b81526004016104ca906120d7565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b919061207d565b610f13610c12565b610f1d9084612096565b610f2791906120b5565b92915050565b60006099544210610e855781610f27565b610f483382610993565b50565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6097546001600160a01b03163314610fa05760405162461bcd60e51b81526004016104ca90611fd0565b610fb46001600160a01b03841683836117d4565b505050565b609a8054610fc690611f95565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff290611f95565b801561103f5780601f106110145761010080835404028352916020019161103f565b820191906000526020600020905b81548152906001019060200180831161102257829003601f168201915b505050505081565b6000609954421061106a5760405162461bcd60e51b81526004016104ca90611f26565b6000611074610c12565b116110915760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a510008210156110b65760405162461bcd60e51b81526004016104ca90612046565b6110be610c12565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561110c57600080fd5b505afa158015611120573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611144919061207d565b61114e9084612096565b61115891906120b5565b905080609b54101561098e5760405162461bcd60e51b81526004016104ca906120d7565b6097546001600160a01b031633146111a65760405162461bcd60e51b81526004016104ca90611fd0565b6098546111bd906001600160a01b031682846117d4565b5050565b6001600160a01b03163b151590565b6040516001600160a01b038085166024830152831660448201526064810182905261123b9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118ee565b50505050565b6001600160a01b0382166112975760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104ca565b80603560008282546112a99190612007565b90915550506001600160a01b038216600090815260336020526040812080548392906112d6908490612007565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166113825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104ca565b6001600160a01b0382166113e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104ca565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006114508484610f4b565b9050600019811461123b57818110156114ab5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104ca565b61123b8484848403611320565b6001600160a01b03831661151c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104ca565b6001600160a01b03821661157e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104ca565b6001600160a01b038316600090815260336020526040902054818110156115f65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104ca565b6001600160a01b0380851660009081526033602052604080822085850390559185168152908120805484929061162d908490612007565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167991815260200190565b60405180910390a361123b565b6001600160a01b0382166116e65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104ca565b6001600160a01b0382166000908152603360205260409020548181101561175a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104ca565b6001600160a01b0383166000908152603360205260408120838303905560358054849290611789908490611f7e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b038316602482015260448101829052610fb490849063a9059cbb60e01b90606401611204565b60008054610100900460ff161561184b578160ff1660011480156118275750303b155b6118435760405162461bcd60e51b81526004016104ca9061211b565b506000919050565b60005460ff8084169116106118725760405162461bcd60e51b81526004016104ca9061211b565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff166118b35760405162461bcd60e51b81526004016104ca90612169565b6111bd82826119c0565b600054610100900460ff166118e45760405162461bcd60e51b81526004016104ca90612169565b6118ec611a0e565b565b6000611943826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a3c9092919063ffffffff16565b805190915015610fb4578080602001905181019061196191906121b4565b610fb45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104ca565b600054610100900460ff166119e75760405162461bcd60e51b81526004016104ca90612169565b81516119fa906036906020850190611bbd565b508051610fb4906037906020840190611bbd565b600054610100900460ff16611a355760405162461bcd60e51b81526004016104ca90612169565b6001606555565b6060611a4b8484600085611a53565b949350505050565b606082471015611ab45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104ca565b6001600160a01b0385163b611b0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104ca565b600080866001600160a01b03168587604051611b2791906121d6565b60006040518083038185875af1925050503d8060008114611b64576040519150601f19603f3d011682016040523d82523d6000602084013e611b69565b606091505b5091509150611b79828286611b84565b979650505050505050565b60608315611b935750816106ad565b825115611ba35782518084602001fd5b8160405162461bcd60e51b81526004016104ca9190611c82565b828054611bc990611f95565b90600052602060002090601f016020900481019282611beb5760008555611c31565b82601f10611c0457805160ff1916838001178555611c31565b82800160010185558215611c31579182015b82811115611c31578251825591602001919060010190611c16565b50611c3d929150611c41565b5090565b5b80821115611c3d5760008155600101611c42565b60005b83811015611c71578181015183820152602001611c59565b8381111561123b5750506000910152565b6020815260008251806020840152611ca1816040850160208701611c56565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610f4857600080fd5b60008060408385031215611cdd57600080fd5b8235611ce881611cb5565b946020939093013593505050565b600060208284031215611d0857600080fd5b5035919050565b600080600060608486031215611d2457600080fd5b8335611d2f81611cb5565b92506020840135611d3f81611cb5565b929592945050506040919091013590565b600060208284031215611d6257600080fd5b81356106ad81611cb5565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d9457600080fd5b813567ffffffffffffffff80821115611daf57611daf611d6d565b604051601f8301601f19908116603f01168101908282118183101715611dd757611dd7611d6d565b81604052838152866020858801011115611df057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c08789031215611e2957600080fd5b863567ffffffffffffffff80821115611e4157600080fd5b611e4d8a838b01611d83565b97506020890135915080821115611e6357600080fd5b611e6f8a838b01611d83565b96506040890135915080821115611e8557600080fd5b50611e9289828a01611d83565b9450506060870135611ea381611cb5565b92506080870135611eb381611cb5565b8092505060a087013590509295509295509295565b60008060408385031215611edb57600080fd5b8235611ee681611cb5565b91506020830135611ef681611cb5565b809150509250929050565b60008060408385031215611f1457600080fd5b823591506020830135611ef681611cb5565b60208082526022908201527f446973636f756e74426f6e643a204d5553545f4245464f52455f4d4154555249604082015261545960f01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611f9057611f90611f68565b500390565b600181811c90821680611fa957607f821691505b60208210811415611fca57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f446973636f756e74426f6e643a20554e415554484f52495a4544000000000000604082015260600190565b6000821982111561201a5761201a611f68565b500190565b6020808252600d908201526c494e56414c49445f505249434560981b604082015260600190565b6020808252601c908201527f446973636f756e74426f6e643a20414d4f554e545f544f4f5f4c4f5700000000604082015260600190565b60006020828403121561208f57600080fd5b5051919050565b60008160001904831182151516156120b0576120b0611f68565b500290565b6000826120d257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f446973636f756e74426f6e643a20494e53554646494349454e545f4c495155496040820152634449545960e01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156121c657600080fd5b815180151581146106ad57600080fd5b600082516121e8818460208701611c56565b919091019291505056fea26469706673582212200271260375176e7f9e8b338e9e48b6eaa2d859cdce139e2cd0ea55af762055b064736f6c63430008090033496e697469616c697a61626c653a20636f6e747261637420697320616c726561", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806395d89b411161011a578063c45a0155116100ad578063e63ea4081161007c578063e63ea40814610455578063f12d870f14610468578063fc48e64214610470578063fde2ba8c14610483578063fe8dbd8e1461049657600080fd5b8063c45a015514610409578063da7b038b1461041c578063db006a751461042f578063dd62ed3e1461044257600080fd5b8063a457c2d7116100e9578063a457c2d7146103c7578063a7731842146103da578063a9059cbb146103e3578063c0da2885146103f657600080fd5b806395d89b411461039157806396e35cea1461039957806398d5fdca146103ac57806398ecd688146103b457600080fd5b806323b872dd1161019d578063395093511161016c578063395093511461031c5780633ce896b81461032f5780634cb4bdc91461034257806370a08231146103555780637a82a1981461037e57600080fd5b806323b872dd146102c65780632491510a146102d95780632495a599146102e2578063313ce5671461030d57600080fd5b80630d6c2618116101d95780630d6c261814610294578063160e3f3d146102a057806318160ddd146102b5578063204f83f9146102bd57600080fd5b806304baa00b1461020b57806306d914061461024857806306fdde0314610269578063095ea7b314610271575b600080fd5b61023260405180604001604052806008815260200167111a5cd8dbdd5b9d60c21b81525081565b60405161023f9190611c82565b60405180910390f35b61025b610256366004611cca565b6104a7565b60405190815260200161023f565b610232610563565b61028461027f366004611cca565b6105f5565b604051901515815260200161023f565b61025b64e8d4a5100081565b6102b36102ae366004611cf6565b61060d565b005b60355461025b565b61025b60995481565b6102846102d4366004611d0f565b61068e565b61025b609b5481565b6098546102f5906001600160a01b031681565b6040516001600160a01b03909116815260200161023f565b6040516012815260200161023f565b61028461032a366004611cca565b6106b4565b61025b61033d366004611cca565b6106d6565b61025b610350366004611cf6565b610780565b61025b610363366004611d50565b6001600160a01b031660009081526033602052604090205490565b6102b361038c366004611cca565b610993565b610232610acd565b6102b36103a7366004611e10565b610adc565b61025b610c12565b61025b6103c2366004611cf6565b610c93565b6102846103d5366004611cca565b610d60565b61025b609c5481565b6102846103f1366004611cca565b610de6565b61025b610404366004611cf6565b610df4565b6097546102f5906001600160a01b031681565b61025b61042a366004611cf6565b610f2d565b6102b361043d366004611cf6565b610f3e565b61025b610450366004611ec8565b610f4b565b6102b3610463366004611d0f565b610f76565b610232610fb9565b61025b61047e366004611cf6565b611047565b6102b3610491366004611f01565b61117c565b61025b6104a4366004611cf6565b90565b600060995442106104d35760405162461bcd60e51b81526004016104ca90611f26565b60405180910390fd5b6098546104eb906001600160a01b03163330856111d0565b6104f482611047565b905080609b60008282546105089190611f7e565b9091555061051890508382611241565b60408051828152602081018490526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca91015b60405180910390a292915050565b60606036805461057290611f95565b80601f016020809104026020016040519081016040528092919081815260200182805461059e90611f95565b80156105eb5780601f106105c0576101008083540402835291602001916105eb565b820191906000526020600020905b8154815290600101906020018083116105ce57829003601f168201915b5050505050905090565b600033610603818585611320565b5060019392505050565b6097546001600160a01b031633146106375760405162461bcd60e51b81526004016104ca90611fd0565b80609b60008282546106499190612007565b9091555050609b546040805183815260208101929092527f632d02909e5759576f4a85e32a3793720a7ca5319576cc41010c4217ddbad0e9910160405180910390a150565b60003361069c858285611444565b6106a78585856114b8565b60019150505b9392505050565b6000336106038185856106c78383610f4b565b6106d19190612007565b611320565b600060995442106106f95760405162461bcd60e51b81526004016104ca90611f26565b61070282610df4565b60985490915061071d906001600160a01b03163330846111d0565b81609b600082825461072f9190611f7e565b9091555061073f90508383611241565b60408051838152602081018390526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca9101610555565b600060995442106107a35760405162461bcd60e51b81526004016104ca90611f26565b60006107ad610c12565b116107ca5760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a510008210156107ef5760405162461bcd60e51b81526004016104ca90612046565b3360009081526033602052604090205482111561084e5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e434500000060448201526064016104ca565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561089c57600080fd5b505afa1580156108b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d4919061207d565b6108dc610c12565b6108e69084612096565b6108f091906120b5565b6098546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b15801561093857600080fd5b505afa15801561094c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610970919061207d565b101561098e5760405162461bcd60e51b81526004016104ca906120d7565b919050565b6099544210156109ef5760405162461bcd60e51b815260206004820152602160248201527f446973636f756e74426f6e643a204d5553545f41465445525f4d4154555249546044820152605960f81b60648201526084016104ca565b33600090815260336020526040902054811115610a4e5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e434500000060448201526064016104ca565b610a583382611686565b80609c6000828254610a6a9190612007565b9091555050609854610a86906001600160a01b031683836117d4565b816001600160a01b03167fbbb59c50b3cd05fe4982a9bc1fbab45bd421ac707f4fba6b080522e3a9cc03b382604051610ac191815260200190565b60405180910390a25050565b60606037805461057290611f95565b6000610ae86001611804565b90508015610b00576000805461ff0019166101001790555b610b0a878761188c565b610b126118bd565b4282118015610b2e5750610b2a426325980600612007565b8211155b610b7a5760405162461bcd60e51b815260206004820152601e60248201527f446973636f756e74426f6e643a20494e56414c49445f4d41545552495459000060448201526064016104ca565b8451610b8d90609a906020880190611bbd565b50609880546001600160a01b038086166001600160a01b031992831617909255609780549287169290911691909117905560998290558015610c09576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6097546040516341976e0960e01b81523060048201526000916001600160a01b0316906341976e099060240160206040518083038186803b158015610c5657600080fd5b505afa158015610c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c8e919061207d565b905090565b60006099544210610cb65760405162461bcd60e51b81526004016104ca90611f26565b6000610cc0610c12565b11610cdd5760405162461bcd60e51b81526004016104ca9061201f565b610ce682610780565b9050610cf23383611686565b81609b6000828254610d049190612007565b9091555050609854610d20906001600160a01b031633836117d4565b604080518381526020810183905233917f3dbe987d8c318f20a1d550dd52db9a8a20cc25aab2f175c7ccafb306ee48d210910160405180910390a2919050565b60003381610d6e8286610f4b565b905083811015610dce5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016104ca565b610ddb8286868403611320565b506001949350505050565b6000336106038185856114b8565b60006099544210610e175760405162461bcd60e51b81526004016104ca90611f26565b6000610e21610c12565b11610e3e5760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a51000821015610e635760405162461bcd60e51b81526004016104ca90612046565b81609b541015610e855760405162461bcd60e51b81526004016104ca906120d7565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed357600080fd5b505afa158015610ee7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0b919061207d565b610f13610c12565b610f1d9084612096565b610f2791906120b5565b92915050565b60006099544210610e855781610f27565b610f483382610993565b50565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6097546001600160a01b03163314610fa05760405162461bcd60e51b81526004016104ca90611fd0565b610fb46001600160a01b03841683836117d4565b505050565b609a8054610fc690611f95565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff290611f95565b801561103f5780601f106110145761010080835404028352916020019161103f565b820191906000526020600020905b81548152906001019060200180831161102257829003601f168201915b505050505081565b6000609954421061106a5760405162461bcd60e51b81526004016104ca90611f26565b6000611074610c12565b116110915760405162461bcd60e51b81526004016104ca9061201f565b64e8d4a510008210156110b65760405162461bcd60e51b81526004016104ca90612046565b6110be610c12565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561110c57600080fd5b505afa158015611120573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611144919061207d565b61114e9084612096565b61115891906120b5565b905080609b54101561098e5760405162461bcd60e51b81526004016104ca906120d7565b6097546001600160a01b031633146111a65760405162461bcd60e51b81526004016104ca90611fd0565b6098546111bd906001600160a01b031682846117d4565b5050565b6001600160a01b03163b151590565b6040516001600160a01b038085166024830152831660448201526064810182905261123b9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526118ee565b50505050565b6001600160a01b0382166112975760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016104ca565b80603560008282546112a99190612007565b90915550506001600160a01b038216600090815260336020526040812080548392906112d6908490612007565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166113825760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016104ca565b6001600160a01b0382166113e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016104ca565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006114508484610f4b565b9050600019811461123b57818110156114ab5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016104ca565b61123b8484848403611320565b6001600160a01b03831661151c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104ca565b6001600160a01b03821661157e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016104ca565b6001600160a01b038316600090815260336020526040902054818110156115f65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104ca565b6001600160a01b0380851660009081526033602052604080822085850390559185168152908120805484929061162d908490612007565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161167991815260200190565b60405180910390a361123b565b6001600160a01b0382166116e65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016104ca565b6001600160a01b0382166000908152603360205260409020548181101561175a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016104ca565b6001600160a01b0383166000908152603360205260408120838303905560358054849290611789908490611f7e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b038316602482015260448101829052610fb490849063a9059cbb60e01b90606401611204565b60008054610100900460ff161561184b578160ff1660011480156118275750303b155b6118435760405162461bcd60e51b81526004016104ca9061211b565b506000919050565b60005460ff8084169116106118725760405162461bcd60e51b81526004016104ca9061211b565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff166118b35760405162461bcd60e51b81526004016104ca90612169565b6111bd82826119c0565b600054610100900460ff166118e45760405162461bcd60e51b81526004016104ca90612169565b6118ec611a0e565b565b6000611943826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611a3c9092919063ffffffff16565b805190915015610fb4578080602001905181019061196191906121b4565b610fb45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104ca565b600054610100900460ff166119e75760405162461bcd60e51b81526004016104ca90612169565b81516119fa906036906020850190611bbd565b508051610fb4906037906020840190611bbd565b600054610100900460ff16611a355760405162461bcd60e51b81526004016104ca90612169565b6001606555565b6060611a4b8484600085611a53565b949350505050565b606082471015611ab45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104ca565b6001600160a01b0385163b611b0b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104ca565b600080866001600160a01b03168587604051611b2791906121d6565b60006040518083038185875af1925050503d8060008114611b64576040519150601f19603f3d011682016040523d82523d6000602084013e611b69565b606091505b5091509150611b79828286611b84565b979650505050505050565b60608315611b935750816106ad565b825115611ba35782518084602001fd5b8160405162461bcd60e51b81526004016104ca9190611c82565b828054611bc990611f95565b90600052602060002090601f016020900481019282611beb5760008555611c31565b82601f10611c0457805160ff1916838001178555611c31565b82800160010185558215611c31579182015b82811115611c31578251825591602001919060010190611c16565b50611c3d929150611c41565b5090565b5b80821115611c3d5760008155600101611c42565b60005b83811015611c71578181015183820152602001611c59565b8381111561123b5750506000910152565b6020815260008251806020840152611ca1816040850160208701611c56565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610f4857600080fd5b60008060408385031215611cdd57600080fd5b8235611ce881611cb5565b946020939093013593505050565b600060208284031215611d0857600080fd5b5035919050565b600080600060608486031215611d2457600080fd5b8335611d2f81611cb5565b92506020840135611d3f81611cb5565b929592945050506040919091013590565b600060208284031215611d6257600080fd5b81356106ad81611cb5565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d9457600080fd5b813567ffffffffffffffff80821115611daf57611daf611d6d565b604051601f8301601f19908116603f01168101908282118183101715611dd757611dd7611d6d565b81604052838152866020858801011115611df057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c08789031215611e2957600080fd5b863567ffffffffffffffff80821115611e4157600080fd5b611e4d8a838b01611d83565b97506020890135915080821115611e6357600080fd5b611e6f8a838b01611d83565b96506040890135915080821115611e8557600080fd5b50611e9289828a01611d83565b9450506060870135611ea381611cb5565b92506080870135611eb381611cb5565b8092505060a087013590509295509295509295565b60008060408385031215611edb57600080fd5b8235611ee681611cb5565b91506020830135611ef681611cb5565b809150509250929050565b60008060408385031215611f1457600080fd5b823591506020830135611ef681611cb5565b60208082526022908201527f446973636f756e74426f6e643a204d5553545f4245464f52455f4d4154555249604082015261545960f01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611f9057611f90611f68565b500390565b600181811c90821680611fa957607f821691505b60208210811415611fca57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f446973636f756e74426f6e643a20554e415554484f52495a4544000000000000604082015260600190565b6000821982111561201a5761201a611f68565b500190565b6020808252600d908201526c494e56414c49445f505249434560981b604082015260600190565b6020808252601c908201527f446973636f756e74426f6e643a20414d4f554e545f544f4f5f4c4f5700000000604082015260600190565b60006020828403121561208f57600080fd5b5051919050565b60008160001904831182151516156120b0576120b0611f68565b500290565b6000826120d257634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f446973636f756e74426f6e643a20494e53554646494349454e545f4c495155496040820152634449545960e01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156121c657600080fd5b815180151581146106ad57600080fd5b600082516121e8818460208701611c56565b919091019291505056fea26469706673582212200271260375176e7f9e8b338e9e48b6eaa2d859cdce139e2cd0ea55af762055b064736f6c63430008090033", + "numDeployments": 9, + "solcInputHash": "6a13f6e055440a5408c02b9e5d62636b", + "metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"inventoryAmount\",\"type\":\"uint256\"}],\"name\":\"BondGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"name\":\"BondMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BondRedeemed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"name\":\"BondSold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MIN_TRADING_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"amountToUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"token_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"emergencyWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"faceValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"contract IBondFactory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ask\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdated\",\"type\":\"uint256\"}],\"internalType\":\"struct IBondFactory.BondPrice\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"}],\"name\":\"grant\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol_\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"series_\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"factory_\",\"type\":\"address\"},{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"underlyingToken_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maturity_\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"isin_\",\"type\":\"string\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inventoryAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isin\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kind\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maturity\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"mintByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"underlyingAmount_\",\"type\":\"uint256\"}],\"name\":\"mintByUnderlyingAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"previewMintByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount_\",\"type\":\"uint256\"}],\"name\":\"previewMintByUnderlyingAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"previewSellByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"redeemFor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"redeemedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bondAmount_\",\"type\":\"uint256\"}],\"name\":\"sellByBondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"series\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount_\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to_\",\"type\":\"address\"}],\"name\":\"underlyingOut\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlyingToken\",\"outputs\":[{\"internalType\":\"contract IERC20Upgradeable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"grant(uint256)\":{\"details\":\"grant specific amount of bond for user mint.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DiscountBond.sol\":\"DiscountBond\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = _setInitializedVersion(1);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n bool isTopLevelCall = _setInitializedVersion(version);\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(version);\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n _setInitializedVersion(type(uint8).max);\\n }\\n\\n function _setInitializedVersion(uint8 version) private returns (bool) {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\\n // of initializers, because in other contexts the contract may have been reentered.\\n if (_initializing) {\\n require(\\n version == 1 && !AddressUpgradeable.isContract(address(this)),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n return false;\\n } else {\\n require(_initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n return true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7454006cccb737612b00104d2f606d728e2818b778e7e55542f063c614ce46ba\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n function __Pausable_init() internal onlyInitializing {\\n __Pausable_init_unchained();\\n }\\n\\n function __Pausable_init_unchained() internal onlyInitializing {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n require(!paused(), \\\"Pausable: paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n require(paused(), \\\"Pausable: not paused\\\");\\n _;\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x041af89e5e60b74e1203d5a34614c9de379726f52ecb8cf064cab78b9fdcdf9d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20Upgradeable.sol\\\";\\nimport \\\"./extensions/IERC20MetadataUpgradeable.sol\\\";\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * The default value of {decimals} is 18. To select a different value for\\n * {decimals} you should overload it.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\\n __ERC20_init_unchained(name_, symbol_);\\n }\\n\\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\n * overridden;\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n }\\n _balances[to] += amount;\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n _balances[account] += amount;\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n }\\n _totalSupply -= amount;\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(\\n address owner,\\n address spender,\\n uint256 amount\\n ) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 amount\\n ) internal virtual {}\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[45] private __gap;\\n}\\n\",\"keccak256\":\"0xb71b875e7f1b8ad082eb6ff83bca4bfa7d050476cc98fd39295826b654edfb46\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 amount\\n ) external returns (bool);\\n}\\n\",\"keccak256\":\"0x4e733d3164f73f461eaf9d8087a7ad1ea180bdc8ba0d3d61b0e1ae16d8e63dff\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x605434219ebbe4653f703640f06969faa5a1d78f0bfef878e5ddbb1ca369ceeb\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20Upgradeable.sol\\\";\\nimport \\\"../../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20Upgradeable {\\n using AddressUpgradeable for address;\\n\\n function safeTransfer(\\n IERC20Upgradeable token,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n }\\n\\n function safeTransferFrom(\\n IERC20Upgradeable token,\\n address from,\\n address to,\\n uint256 value\\n ) internal {\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n }\\n\\n /**\\n * @dev Deprecated. This function has issues similar to the ones found in\\n * {IERC20-approve}, and its usage is discouraged.\\n *\\n * Whenever possible, use {safeIncreaseAllowance} and\\n * {safeDecreaseAllowance} instead.\\n */\\n function safeApprove(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n // safeApprove should only be called when setting an initial allowance,\\n // or when resetting it to zero. To increase and decrease it, use\\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n require(\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\n \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n );\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n }\\n\\n function safeIncreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n\\n function safeDecreaseAllowance(\\n IERC20Upgradeable token,\\n address spender,\\n uint256 value\\n ) internal {\\n unchecked {\\n uint256 oldAllowance = token.allowance(address(this), spender);\\n require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n uint256 newAllowance = oldAllowance - value;\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n }\\n }\\n\\n /**\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\n * @param token The token targeted by the call.\\n * @param data The call data (encoded using abi.encode or one of its variants).\\n */\\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n // the target address contains contract code and also asserts for success in the low-level call.\\n\\n bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n if (returndata.length > 0) {\\n // Return data is optional\\n require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3e26a49d2fa5ef8338b8a9467c91e54f417cb07e849b1cc0f4ebc4d2a147938e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x55cf2bd9fc76704ddcdc19834cd288b7de00fc0f298a40ea16a954ae8991db2d\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"contracts/DiscountBond.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\\\";\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\nimport \\\"./interfaces/IBond.sol\\\";\\nimport \\\"./interfaces/IBondFactory.sol\\\";\\n\\ncontract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond {\\n using SafeERC20Upgradeable for IERC20Upgradeable;\\n string public constant kind = \\\"Discount\\\";\\n uint256 public constant MIN_TRADING_AMOUNT = 1e12;\\n\\n IBondFactory public factory;\\n IERC20Upgradeable public underlyingToken;\\n uint256 public maturity;\\n string public series;\\n uint256 public inventoryAmount;\\n uint256 public redeemedAmount;\\n string public isin;\\n\\n event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\\n event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\\n event BondRedeemed(address indexed account, uint256 amount);\\n event BondGranted(uint256 amount, uint256 inventoryAmount);\\n\\n /// @custom:oz-upgrades-unsafe-allow constructor\\n constructor() {\\n _disableInitializers();\\n }\\n\\n function initialize(\\n string memory name_,\\n string memory symbol_,\\n string memory series_,\\n address factory_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_,\\n string memory isin_\\n ) external initializer {\\n __ERC20_init(name_, symbol_);\\n __ReentrancyGuard_init();\\n require(\\n maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days),\\n \\\"DiscountBond: INVALID_MATURITY\\\"\\n );\\n series = series_;\\n underlyingToken = underlyingToken_;\\n factory = IBondFactory(factory_);\\n maturity = maturity_;\\n isin = isin_;\\n }\\n\\n modifier beforeMaturity() {\\n require(block.timestamp < maturity, \\\"DiscountBond: MUST_BEFORE_MATURITY\\\");\\n _;\\n }\\n\\n modifier afterMaturity() {\\n require(block.timestamp >= maturity, \\\"DiscountBond: MUST_AFTER_MATURITY\\\");\\n _;\\n }\\n\\n modifier tradingGuard() {\\n _;\\n }\\n\\n modifier onlyFactory() {\\n require(msg.sender == address(factory), \\\"DiscountBond: UNAUTHORIZED\\\");\\n _;\\n }\\n\\n /**\\n * @dev grant specific amount of bond for user mint.\\n */\\n function grant(uint256 amount_) external onlyFactory {\\n inventoryAmount += amount_;\\n emit BondGranted(amount_, inventoryAmount);\\n }\\n\\n function getPrice() public view returns (IBondFactory.BondPrice memory) {\\n return factory.getPrice(address(this));\\n }\\n\\n function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_)\\n external\\n beforeMaturity\\n nonReentrant\\n returns (uint256 bondAmount)\\n {\\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_);\\n bondAmount = previewMintByUnderlyingAmount(underlyingAmount_);\\n inventoryAmount -= bondAmount;\\n _mint(account_, bondAmount);\\n emit BondMinted(account_, bondAmount, underlyingAmount_);\\n }\\n\\n function previewMintByUnderlyingAmount(uint256 underlyingAmount_)\\n public\\n view\\n beforeMaturity\\n tradingGuard\\n returns (uint256 bondAmount)\\n {\\n require(underlyingAmount_ >= MIN_TRADING_AMOUNT, \\\"DiscountBond: AMOUNT_TOO_LOW\\\");\\n bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice().ask;\\n require(inventoryAmount >= bondAmount, \\\"DiscountBond: INSUFFICIENT_LIQUIDITY\\\");\\n }\\n\\n function mintByBondAmount(address account_, uint256 bondAmount_)\\n external\\n nonReentrant\\n beforeMaturity\\n returns (uint256 underlyingAmount)\\n {\\n underlyingAmount = previewMintByBondAmount(bondAmount_);\\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount);\\n inventoryAmount -= bondAmount_;\\n _mint(account_, bondAmount_);\\n emit BondMinted(account_, bondAmount_, underlyingAmount);\\n }\\n\\n function previewMintByBondAmount(uint256 bondAmount_)\\n public\\n view\\n beforeMaturity\\n tradingGuard\\n returns (uint256 underlyingAmount)\\n {\\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \\\"DiscountBond: AMOUNT_TOO_LOW\\\");\\n require(inventoryAmount >= bondAmount_, \\\"DiscountBond: INSUFFICIENT_LIQUIDITY\\\");\\n underlyingAmount = (bondAmount_ * getPrice().ask) / factory.priceFactor();\\n }\\n\\n function sellByBondAmount(uint256 bondAmount_)\\n public\\n beforeMaturity\\n nonReentrant\\n tradingGuard\\n returns (uint256 underlyingAmount)\\n {\\n underlyingAmount = previewSellByBondAmount(bondAmount_);\\n _burn(msg.sender, bondAmount_);\\n inventoryAmount += bondAmount_;\\n underlyingToken.safeTransfer(msg.sender, underlyingAmount);\\n emit BondSold(msg.sender, bondAmount_, underlyingAmount);\\n }\\n\\n function previewSellByBondAmount(uint256 bondAmount_)\\n public\\n view\\n beforeMaturity\\n tradingGuard\\n returns (uint256 underlyingAmount)\\n {\\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \\\"DiscountBond: AMOUNT_TOO_LOW\\\");\\n require(balanceOf(msg.sender) >= bondAmount_, \\\"DiscountBond: EXCEEDS_BALANCE\\\");\\n underlyingAmount = (bondAmount_ * getPrice().bid) / factory.priceFactor();\\n require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, \\\"DiscountBond: INSUFFICIENT_LIQUIDITY\\\");\\n }\\n\\n function redeem(uint256 bondAmount_) public {\\n redeemFor(msg.sender, bondAmount_);\\n }\\n\\n function faceValue(uint256 bondAmount_) public view returns (uint256) {\\n return bondAmount_;\\n }\\n\\n function amountToUnderlying(uint256 bondAmount_) public view returns (uint256) {\\n if (block.timestamp >= maturity) {\\n return faceValue(bondAmount_);\\n }\\n return (bondAmount_ * getPrice().price) / factory.priceFactor();\\n }\\n\\n function redeemFor(address account_, uint256 bondAmount_) public afterMaturity nonReentrant {\\n require(balanceOf(msg.sender) >= bondAmount_, \\\"DiscountBond: EXCEEDS_BALANCE\\\");\\n _burn(msg.sender, bondAmount_);\\n redeemedAmount += bondAmount_;\\n underlyingToken.safeTransfer(account_, bondAmount_);\\n emit BondRedeemed(account_, bondAmount_);\\n }\\n\\n /**\\n * @notice\\n */\\n function underlyingOut(uint256 amount_, address to_) external onlyFactory {\\n underlyingToken.safeTransfer(to_, amount_);\\n }\\n\\n function emergencyWithdraw(\\n IERC20Upgradeable token_,\\n address to_,\\n uint256 amount_\\n ) external onlyFactory {\\n token_.safeTransfer(to_, amount_);\\n }\\n}\\n\",\"keccak256\":\"0x37cc34eca6c9c663079e0fe970a0d4c410eab1deea7792ab13ba3570b5b4ffb8\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBond.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\\\";\\n\\ninterface IBond is IERC20Upgradeable {\\n function initialize(\\n string memory name_,\\n string memory symbol_,\\n string memory series,\\n address factory_,\\n IERC20Upgradeable underlyingToken_,\\n uint256 maturity_,\\n string memory isin_\\n ) external;\\n\\n function kind() external returns (string memory);\\n\\n function series() external returns (string memory);\\n\\n function isin() external returns (string memory);\\n\\n function underlyingOut(uint256 amount_, address to_) external;\\n\\n function grant(uint256 amount_) external;\\n\\n function faceValue(uint256 bondAmount_) external view returns (uint256);\\n\\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xe62bb491085455e9fdfff5f7be1b910a84c827d350eee7ba0b75b517ff440b76\",\"license\":\"GPL-3.0\"},\"contracts/interfaces/IBondFactory.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity 0.8.9;\\n\\ninterface IBondFactory {\\n struct BondPrice {\\n uint256 price;\\n uint256 bid;\\n uint256 ask;\\n uint256 lastUpdated;\\n }\\n\\n function priceFactor() external view returns (uint256);\\n\\n function getPrice(address bondToken_) external view returns (BondPrice memory price);\\n}\\n\",\"keccak256\":\"0xa790c14699d29d50822772d6f03aef5a2f31e27b161bda85ebc0736369eeba02\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506200001c62000022565b62000152565b6200002e60ff62000031565b50565b60008054610100900460ff1615620000ca578160ff1660011480156200006a575062000068306200014360201b6200130b1760201c565b155b620000c25760405162461bcd60e51b815260206004820152602e60248201526000805160206200257583398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff808416911610620001295760405162461bcd60e51b815260206004820152602e60248201526000805160206200257583398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000b9565b506000805460ff191660ff92909216919091179055600190565b6001600160a01b03163b151590565b61241380620001626000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806382d5a60d11610125578063da7b038b116100ad578063e63ea4081161007c578063e63ea4081461049b578063f12d870f146104ae578063fc48e642146104b6578063fde2ba8c146104c9578063fe8dbd8e146104dc57600080fd5b8063da7b038b1461044f578063db006a7514610462578063dd62ed3e14610475578063df776b2d1461048857600080fd5b8063a457c2d7116100f4578063a457c2d7146103fa578063a77318421461040d578063a9059cbb14610416578063c0da288514610429578063c45a01551461043c57600080fd5b806382d5a60d1461039c57806395d89b41146103a457806398d5fdca146103ac57806398ecd688146103e757600080fd5b806323b872dd116101a8578063395093511161017757806339509351146103275780633ce896b81461033a5780634cb4bdc91461034d57806370a08231146103605780637a82a1981461038957600080fd5b806323b872dd146102d15780632491510a146102e45780632495a599146102ed578063313ce5671461031857600080fd5b80630d6c2618116101e45780630d6c26181461029f578063160e3f3d146102ab57806318160ddd146102c0578063204f83f9146102c857600080fd5b806304baa00b1461021657806306d914061461025357806306fdde0314610274578063095ea7b31461027c575b600080fd5b61023d60405180604001604052806008815260200167111a5cd8dbdd5b9d60c21b81525081565b60405161024a9190611dcc565b60405180910390f35b610266610261366004611e1f565b6104ed565b60405190815260200161024a565b61023d6105d6565b61028f61028a366004611e1f565b610668565b604051901515815260200161024a565b61026664e8d4a5100081565b6102be6102b9366004611e4b565b610680565b005b603554610266565b61026660995481565b61028f6102df366004611e64565b610701565b610266609b5481565b609854610300906001600160a01b031681565b6040516001600160a01b03909116815260200161024a565b6040516012815260200161024a565b61028f610335366004611e1f565b610727565b610266610348366004611e1f565b610749565b61026661035b366004611e4b565b61081b565b61026661036e366004611ea5565b6001600160a01b031660009081526033602052604090205490565b6102be610397366004611e1f565b610a0b565b61023d610b72565b61023d610c00565b6103b4610c0f565b60405161024a91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6102666103f5366004611e4b565b610cba565b61028f610408366004611e1f565b610d8d565b610266609c5481565b61028f610424366004611e1f565b610e13565b610266610437366004611e4b565b610e21565b609754610300906001600160a01b031681565b61026661045d366004611e4b565b610f37565b6102be610470366004611e4b565b610fe1565b610266610483366004611ec2565b610fee565b6102be610496366004611f9e565b611019565b6102be6104a9366004611e64565b611164565b61023d6111a7565b6102666104c4366004611e4b565b6111b4565b6102be6104d7366004612076565b6112c6565b6102666104ea366004611e4b565b90565b600060995442106105195760405162461bcd60e51b81526004016105109061209b565b60405180910390fd5b6002606554141561053c5760405162461bcd60e51b8152600401610510906120dd565b6002606555609854610559906001600160a01b031633308561131a565b610562826111b4565b905080609b6000828254610576919061212a565b909155506105869050838261138b565b60408051828152602081018490526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca91015b60405180910390a2600160655592915050565b6060603680546105e590612141565b80601f016020809104026020016040519081016040528092919081815260200182805461061190612141565b801561065e5780601f106106335761010080835404028352916020019161065e565b820191906000526020600020905b81548152906001019060200180831161064157829003601f168201915b5050505050905090565b60003361067681858561146a565b5060019392505050565b6097546001600160a01b031633146106aa5760405162461bcd60e51b81526004016105109061217c565b80609b60008282546106bc91906121b3565b9091555050609b546040805183815260208101929092527f632d02909e5759576f4a85e32a3793720a7ca5319576cc41010c4217ddbad0e9910160405180910390a150565b60003361070f85828561158e565b61071a858585611602565b60019150505b9392505050565b60003361067681858561073a8383610fee565b61074491906121b3565b61146a565b60006002606554141561076e5760405162461bcd60e51b8152600401610510906120dd565b600260655560995442106107945760405162461bcd60e51b81526004016105109061209b565b61079d82610e21565b6098549091506107b8906001600160a01b031633308461131a565b81609b60008282546107ca919061212a565b909155506107da9050838361138b565b60408051838152602081018390526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca91016105c3565b6000609954421061083e5760405162461bcd60e51b81526004016105109061209b565b64e8d4a510008210156108635760405162461bcd60e51b8152600401610510906121cb565b336000908152603360205260409020548211156108c25760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e43450000006044820152606401610510565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561091057600080fd5b505afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190612202565b610950610c0f565b6020015161095e908461221b565b610968919061223a565b6098546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b1580156109b057600080fd5b505afa1580156109c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e89190612202565b1015610a065760405162461bcd60e51b81526004016105109061225c565b919050565b609954421015610a675760405162461bcd60e51b815260206004820152602160248201527f446973636f756e74426f6e643a204d5553545f41465445525f4d4154555249546044820152605960f81b6064820152608401610510565b60026065541415610a8a5760405162461bcd60e51b8152600401610510906120dd565b600260655533600090815260336020526040902054811115610aee5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e43450000006044820152606401610510565b610af833826117d0565b80609c6000828254610b0a91906121b3565b9091555050609854610b26906001600160a01b0316838361191e565b816001600160a01b03167fbbb59c50b3cd05fe4982a9bc1fbab45bd421ac707f4fba6b080522e3a9cc03b382604051610b6191815260200190565b60405180910390a250506001606555565b609d8054610b7f90612141565b80601f0160208091040260200160405190810160405280929190818152602001828054610bab90612141565b8015610bf85780601f10610bcd57610100808354040283529160200191610bf8565b820191906000526020600020905b815481529060010190602001808311610bdb57829003601f168201915b505050505081565b6060603780546105e590612141565b610c3a6040518060800160405280600081526020016000815260200160008152602001600081525090565b6097546040516341976e0960e01b81523060048201526001600160a01b03909116906341976e099060240160806040518083038186803b158015610c7d57600080fd5b505afa158015610c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb591906122a0565b905090565b60006099544210610cdd5760405162461bcd60e51b81526004016105109061209b565b60026065541415610d005760405162461bcd60e51b8152600401610510906120dd565b6002606555610d0e8261081b565b9050610d1a33836117d0565b81609b6000828254610d2c91906121b3565b9091555050609854610d48906001600160a01b0316338361191e565b604080518381526020810183905233917f3dbe987d8c318f20a1d550dd52db9a8a20cc25aab2f175c7ccafb306ee48d210910160405180910390a26001606555919050565b60003381610d9b8286610fee565b905083811015610dfb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610510565b610e08828686840361146a565b506001949350505050565b600033610676818585611602565b60006099544210610e445760405162461bcd60e51b81526004016105109061209b565b64e8d4a51000821015610e695760405162461bcd60e51b8152600401610510906121cb565b81609b541015610e8b5760405162461bcd60e51b81526004016105109061225c565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed957600080fd5b505afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f119190612202565b610f19610c0f565b60400151610f27908461221b565b610f31919061223a565b92915050565b60006099544210610f485781610f31565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce9190612202565b610fd6610c0f565b51610f27908461221b565b610feb3382610a0b565b50565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6000611025600161194e565b9050801561103d576000805461ff0019166101001790555b61104788886119d6565b61104f611a07565b428311801561106b57506110674263259806006121b3565b8311155b6110b75760405162461bcd60e51b815260206004820152601e60248201527f446973636f756e74426f6e643a20494e56414c49445f4d4154555249545900006044820152606401610510565b85516110ca90609a906020890190611d07565b50609880546001600160a01b038087166001600160a01b03199283161790925560978054928816929091169190911790556099839055815161111390609d906020850190611d07565b50801561115a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6097546001600160a01b0316331461118e5760405162461bcd60e51b81526004016105109061217c565b6111a26001600160a01b038416838361191e565b505050565b609a8054610b7f90612141565b600060995442106111d75760405162461bcd60e51b81526004016105109061209b565b64e8d4a510008210156111fc5760405162461bcd60e51b8152600401610510906121cb565b611204610c0f565b60400151609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125657600080fd5b505afa15801561126a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128e9190612202565b611298908461221b565b6112a2919061223a565b905080609b541015610a065760405162461bcd60e51b81526004016105109061225c565b6097546001600160a01b031633146112f05760405162461bcd60e51b81526004016105109061217c565b609854611307906001600160a01b0316828461191e565b5050565b6001600160a01b03163b151590565b6040516001600160a01b03808516602483015283166044820152606481018290526113859085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a38565b50505050565b6001600160a01b0382166113e15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610510565b80603560008282546113f391906121b3565b90915550506001600160a01b038216600090815260336020526040812080548392906114209084906121b3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166114cc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610510565b6001600160a01b03821661152d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610510565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061159a8484610fee565b9050600019811461138557818110156115f55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610510565b611385848484840361146a565b6001600160a01b0383166116665760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610510565b6001600160a01b0382166116c85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610510565b6001600160a01b038316600090815260336020526040902054818110156117405760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610510565b6001600160a01b038085166000908152603360205260408082208585039055918516815290812080548492906117779084906121b3565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117c391815260200190565b60405180910390a3611385565b6001600160a01b0382166118305760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610510565b6001600160a01b038216600090815260336020526040902054818110156118a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610510565b6001600160a01b03831660009081526033602052604081208383039055603580548492906118d390849061212a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b0383166024820152604481018290526111a290849063a9059cbb60e01b9060640161134e565b60008054610100900460ff1615611995578160ff1660011480156119715750303b155b61198d5760405162461bcd60e51b815260040161051090612306565b506000919050565b60005460ff8084169116106119bc5760405162461bcd60e51b815260040161051090612306565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff166119fd5760405162461bcd60e51b815260040161051090612354565b6113078282611b0a565b600054610100900460ff16611a2e5760405162461bcd60e51b815260040161051090612354565b611a36611b58565b565b6000611a8d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611b869092919063ffffffff16565b8051909150156111a25780806020019051810190611aab919061239f565b6111a25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610510565b600054610100900460ff16611b315760405162461bcd60e51b815260040161051090612354565b8151611b44906036906020850190611d07565b5080516111a2906037906020840190611d07565b600054610100900460ff16611b7f5760405162461bcd60e51b815260040161051090612354565b6001606555565b6060611b958484600085611b9d565b949350505050565b606082471015611bfe5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610510565b6001600160a01b0385163b611c555760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610510565b600080866001600160a01b03168587604051611c7191906123c1565b60006040518083038185875af1925050503d8060008114611cae576040519150601f19603f3d011682016040523d82523d6000602084013e611cb3565b606091505b5091509150611cc3828286611cce565b979650505050505050565b60608315611cdd575081610720565b825115611ced5782518084602001fd5b8160405162461bcd60e51b81526004016105109190611dcc565b828054611d1390612141565b90600052602060002090601f016020900481019282611d355760008555611d7b565b82601f10611d4e57805160ff1916838001178555611d7b565b82800160010185558215611d7b579182015b82811115611d7b578251825591602001919060010190611d60565b50611d87929150611d8b565b5090565b5b80821115611d875760008155600101611d8c565b60005b83811015611dbb578181015183820152602001611da3565b838111156113855750506000910152565b6020815260008251806020840152611deb816040850160208701611da0565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610feb57600080fd5b8035610a0681611dff565b60008060408385031215611e3257600080fd5b8235611e3d81611dff565b946020939093013593505050565b600060208284031215611e5d57600080fd5b5035919050565b600080600060608486031215611e7957600080fd5b8335611e8481611dff565b92506020840135611e9481611dff565b929592945050506040919091013590565b600060208284031215611eb757600080fd5b813561072081611dff565b60008060408385031215611ed557600080fd5b8235611ee081611dff565b91506020830135611ef081611dff565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611f2257600080fd5b813567ffffffffffffffff80821115611f3d57611f3d611efb565b604051601f8301601f19908116603f01168101908282118183101715611f6557611f65611efb565b81604052838152866020858801011115611f7e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215611fb957600080fd5b873567ffffffffffffffff80821115611fd157600080fd5b611fdd8b838c01611f11565b985060208a0135915080821115611ff357600080fd5b611fff8b838c01611f11565b975060408a013591508082111561201557600080fd5b6120218b838c01611f11565b965061202f60608b01611e14565b955061203d60808b01611e14565b945060a08a0135935060c08a013591508082111561205a57600080fd5b506120678a828b01611f11565b91505092959891949750929550565b6000806040838503121561208957600080fd5b823591506020830135611ef081611dff565b60208082526022908201527f446973636f756e74426f6e643a204d5553545f4245464f52455f4d4154555249604082015261545960f01b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561213c5761213c612114565b500390565b600181811c9082168061215557607f821691505b6020821081141561217657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f446973636f756e74426f6e643a20554e415554484f52495a4544000000000000604082015260600190565b600082198211156121c6576121c6612114565b500190565b6020808252601c908201527f446973636f756e74426f6e643a20414d4f554e545f544f4f5f4c4f5700000000604082015260600190565b60006020828403121561221457600080fd5b5051919050565b600081600019048311821515161561223557612235612114565b500290565b60008261225757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f446973636f756e74426f6e643a20494e53554646494349454e545f4c495155496040820152634449545960e01b606082015260800190565b6000608082840312156122b257600080fd5b6040516080810181811067ffffffffffffffff821117156122d5576122d5611efb565b8060405250825181526020830151602082015260408301516040820152606083015160608201528091505092915050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156123b157600080fd5b8151801515811461072057600080fd5b600082516123d3818460208701611da0565b919091019291505056fea2646970667358221220f52284f9a20fe61006d00c8be9081e7d52b5d3f0adef6390748938fe6ade65d264736f6c63430008090033496e697469616c697a61626c653a20636f6e747261637420697320616c726561", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102115760003560e01c806382d5a60d11610125578063da7b038b116100ad578063e63ea4081161007c578063e63ea4081461049b578063f12d870f146104ae578063fc48e642146104b6578063fde2ba8c146104c9578063fe8dbd8e146104dc57600080fd5b8063da7b038b1461044f578063db006a7514610462578063dd62ed3e14610475578063df776b2d1461048857600080fd5b8063a457c2d7116100f4578063a457c2d7146103fa578063a77318421461040d578063a9059cbb14610416578063c0da288514610429578063c45a01551461043c57600080fd5b806382d5a60d1461039c57806395d89b41146103a457806398d5fdca146103ac57806398ecd688146103e757600080fd5b806323b872dd116101a8578063395093511161017757806339509351146103275780633ce896b81461033a5780634cb4bdc91461034d57806370a08231146103605780637a82a1981461038957600080fd5b806323b872dd146102d15780632491510a146102e45780632495a599146102ed578063313ce5671461031857600080fd5b80630d6c2618116101e45780630d6c26181461029f578063160e3f3d146102ab57806318160ddd146102c0578063204f83f9146102c857600080fd5b806304baa00b1461021657806306d914061461025357806306fdde0314610274578063095ea7b31461027c575b600080fd5b61023d60405180604001604052806008815260200167111a5cd8dbdd5b9d60c21b81525081565b60405161024a9190611dcc565b60405180910390f35b610266610261366004611e1f565b6104ed565b60405190815260200161024a565b61023d6105d6565b61028f61028a366004611e1f565b610668565b604051901515815260200161024a565b61026664e8d4a5100081565b6102be6102b9366004611e4b565b610680565b005b603554610266565b61026660995481565b61028f6102df366004611e64565b610701565b610266609b5481565b609854610300906001600160a01b031681565b6040516001600160a01b03909116815260200161024a565b6040516012815260200161024a565b61028f610335366004611e1f565b610727565b610266610348366004611e1f565b610749565b61026661035b366004611e4b565b61081b565b61026661036e366004611ea5565b6001600160a01b031660009081526033602052604090205490565b6102be610397366004611e1f565b610a0b565b61023d610b72565b61023d610c00565b6103b4610c0f565b60405161024a91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b6102666103f5366004611e4b565b610cba565b61028f610408366004611e1f565b610d8d565b610266609c5481565b61028f610424366004611e1f565b610e13565b610266610437366004611e4b565b610e21565b609754610300906001600160a01b031681565b61026661045d366004611e4b565b610f37565b6102be610470366004611e4b565b610fe1565b610266610483366004611ec2565b610fee565b6102be610496366004611f9e565b611019565b6102be6104a9366004611e64565b611164565b61023d6111a7565b6102666104c4366004611e4b565b6111b4565b6102be6104d7366004612076565b6112c6565b6102666104ea366004611e4b565b90565b600060995442106105195760405162461bcd60e51b81526004016105109061209b565b60405180910390fd5b6002606554141561053c5760405162461bcd60e51b8152600401610510906120dd565b6002606555609854610559906001600160a01b031633308561131a565b610562826111b4565b905080609b6000828254610576919061212a565b909155506105869050838261138b565b60408051828152602081018490526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca91015b60405180910390a2600160655592915050565b6060603680546105e590612141565b80601f016020809104026020016040519081016040528092919081815260200182805461061190612141565b801561065e5780601f106106335761010080835404028352916020019161065e565b820191906000526020600020905b81548152906001019060200180831161064157829003601f168201915b5050505050905090565b60003361067681858561146a565b5060019392505050565b6097546001600160a01b031633146106aa5760405162461bcd60e51b81526004016105109061217c565b80609b60008282546106bc91906121b3565b9091555050609b546040805183815260208101929092527f632d02909e5759576f4a85e32a3793720a7ca5319576cc41010c4217ddbad0e9910160405180910390a150565b60003361070f85828561158e565b61071a858585611602565b60019150505b9392505050565b60003361067681858561073a8383610fee565b61074491906121b3565b61146a565b60006002606554141561076e5760405162461bcd60e51b8152600401610510906120dd565b600260655560995442106107945760405162461bcd60e51b81526004016105109061209b565b61079d82610e21565b6098549091506107b8906001600160a01b031633308461131a565b81609b60008282546107ca919061212a565b909155506107da9050838361138b565b60408051838152602081018390526001600160a01b038516917f877d49304b52a404e1f7fe620a933370ab38d3d49a4daf24591f8750848310ca91016105c3565b6000609954421061083e5760405162461bcd60e51b81526004016105109061209b565b64e8d4a510008210156108635760405162461bcd60e51b8152600401610510906121cb565b336000908152603360205260409020548211156108c25760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e43450000006044820152606401610510565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561091057600080fd5b505afa158015610924573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109489190612202565b610950610c0f565b6020015161095e908461221b565b610968919061223a565b6098546040516370a0823160e01b815230600482015291925082916001600160a01b03909116906370a082319060240160206040518083038186803b1580156109b057600080fd5b505afa1580156109c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e89190612202565b1015610a065760405162461bcd60e51b81526004016105109061225c565b919050565b609954421015610a675760405162461bcd60e51b815260206004820152602160248201527f446973636f756e74426f6e643a204d5553545f41465445525f4d4154555249546044820152605960f81b6064820152608401610510565b60026065541415610a8a5760405162461bcd60e51b8152600401610510906120dd565b600260655533600090815260336020526040902054811115610aee5760405162461bcd60e51b815260206004820152601d60248201527f446973636f756e74426f6e643a20455843454544535f42414c414e43450000006044820152606401610510565b610af833826117d0565b80609c6000828254610b0a91906121b3565b9091555050609854610b26906001600160a01b0316838361191e565b816001600160a01b03167fbbb59c50b3cd05fe4982a9bc1fbab45bd421ac707f4fba6b080522e3a9cc03b382604051610b6191815260200190565b60405180910390a250506001606555565b609d8054610b7f90612141565b80601f0160208091040260200160405190810160405280929190818152602001828054610bab90612141565b8015610bf85780601f10610bcd57610100808354040283529160200191610bf8565b820191906000526020600020905b815481529060010190602001808311610bdb57829003601f168201915b505050505081565b6060603780546105e590612141565b610c3a6040518060800160405280600081526020016000815260200160008152602001600081525090565b6097546040516341976e0960e01b81523060048201526001600160a01b03909116906341976e099060240160806040518083038186803b158015610c7d57600080fd5b505afa158015610c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb591906122a0565b905090565b60006099544210610cdd5760405162461bcd60e51b81526004016105109061209b565b60026065541415610d005760405162461bcd60e51b8152600401610510906120dd565b6002606555610d0e8261081b565b9050610d1a33836117d0565b81609b6000828254610d2c91906121b3565b9091555050609854610d48906001600160a01b0316338361191e565b604080518381526020810183905233917f3dbe987d8c318f20a1d550dd52db9a8a20cc25aab2f175c7ccafb306ee48d210910160405180910390a26001606555919050565b60003381610d9b8286610fee565b905083811015610dfb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610510565b610e08828686840361146a565b506001949350505050565b600033610676818585611602565b60006099544210610e445760405162461bcd60e51b81526004016105109061209b565b64e8d4a51000821015610e695760405162461bcd60e51b8152600401610510906121cb565b81609b541015610e8b5760405162461bcd60e51b81526004016105109061225c565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ed957600080fd5b505afa158015610eed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f119190612202565b610f19610c0f565b60400151610f27908461221b565b610f31919061223a565b92915050565b60006099544210610f485781610f31565b609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce9190612202565b610fd6610c0f565b51610f27908461221b565b610feb3382610a0b565b50565b6001600160a01b03918216600090815260346020908152604080832093909416825291909152205490565b6000611025600161194e565b9050801561103d576000805461ff0019166101001790555b61104788886119d6565b61104f611a07565b428311801561106b57506110674263259806006121b3565b8311155b6110b75760405162461bcd60e51b815260206004820152601e60248201527f446973636f756e74426f6e643a20494e56414c49445f4d4154555249545900006044820152606401610510565b85516110ca90609a906020890190611d07565b50609880546001600160a01b038087166001600160a01b03199283161790925560978054928816929091169190911790556099839055815161111390609d906020850190611d07565b50801561115a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b6097546001600160a01b0316331461118e5760405162461bcd60e51b81526004016105109061217c565b6111a26001600160a01b038416838361191e565b505050565b609a8054610b7f90612141565b600060995442106111d75760405162461bcd60e51b81526004016105109061209b565b64e8d4a510008210156111fc5760405162461bcd60e51b8152600401610510906121cb565b611204610c0f565b60400151609760009054906101000a90046001600160a01b03166001600160a01b031663dfb2866d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561125657600080fd5b505afa15801561126a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128e9190612202565b611298908461221b565b6112a2919061223a565b905080609b541015610a065760405162461bcd60e51b81526004016105109061225c565b6097546001600160a01b031633146112f05760405162461bcd60e51b81526004016105109061217c565b609854611307906001600160a01b0316828461191e565b5050565b6001600160a01b03163b151590565b6040516001600160a01b03808516602483015283166044820152606481018290526113859085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a38565b50505050565b6001600160a01b0382166113e15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610510565b80603560008282546113f391906121b3565b90915550506001600160a01b038216600090815260336020526040812080548392906114209084906121b3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0383166114cc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610510565b6001600160a01b03821661152d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610510565b6001600160a01b0383811660008181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061159a8484610fee565b9050600019811461138557818110156115f55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610510565b611385848484840361146a565b6001600160a01b0383166116665760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610510565b6001600160a01b0382166116c85760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610510565b6001600160a01b038316600090815260336020526040902054818110156117405760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610510565b6001600160a01b038085166000908152603360205260408082208585039055918516815290812080548492906117779084906121b3565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117c391815260200190565b60405180910390a3611385565b6001600160a01b0382166118305760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610510565b6001600160a01b038216600090815260336020526040902054818110156118a45760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610510565b6001600160a01b03831660009081526033602052604081208383039055603580548492906118d390849061212a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6040516001600160a01b0383166024820152604481018290526111a290849063a9059cbb60e01b9060640161134e565b60008054610100900460ff1615611995578160ff1660011480156119715750303b155b61198d5760405162461bcd60e51b815260040161051090612306565b506000919050565b60005460ff8084169116106119bc5760405162461bcd60e51b815260040161051090612306565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff166119fd5760405162461bcd60e51b815260040161051090612354565b6113078282611b0a565b600054610100900460ff16611a2e5760405162461bcd60e51b815260040161051090612354565b611a36611b58565b565b6000611a8d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611b869092919063ffffffff16565b8051909150156111a25780806020019051810190611aab919061239f565b6111a25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610510565b600054610100900460ff16611b315760405162461bcd60e51b815260040161051090612354565b8151611b44906036906020850190611d07565b5080516111a2906037906020840190611d07565b600054610100900460ff16611b7f5760405162461bcd60e51b815260040161051090612354565b6001606555565b6060611b958484600085611b9d565b949350505050565b606082471015611bfe5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610510565b6001600160a01b0385163b611c555760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610510565b600080866001600160a01b03168587604051611c7191906123c1565b60006040518083038185875af1925050503d8060008114611cae576040519150601f19603f3d011682016040523d82523d6000602084013e611cb3565b606091505b5091509150611cc3828286611cce565b979650505050505050565b60608315611cdd575081610720565b825115611ced5782518084602001fd5b8160405162461bcd60e51b81526004016105109190611dcc565b828054611d1390612141565b90600052602060002090601f016020900481019282611d355760008555611d7b565b82601f10611d4e57805160ff1916838001178555611d7b565b82800160010185558215611d7b579182015b82811115611d7b578251825591602001919060010190611d60565b50611d87929150611d8b565b5090565b5b80821115611d875760008155600101611d8c565b60005b83811015611dbb578181015183820152602001611da3565b838111156113855750506000910152565b6020815260008251806020840152611deb816040850160208701611da0565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610feb57600080fd5b8035610a0681611dff565b60008060408385031215611e3257600080fd5b8235611e3d81611dff565b946020939093013593505050565b600060208284031215611e5d57600080fd5b5035919050565b600080600060608486031215611e7957600080fd5b8335611e8481611dff565b92506020840135611e9481611dff565b929592945050506040919091013590565b600060208284031215611eb757600080fd5b813561072081611dff565b60008060408385031215611ed557600080fd5b8235611ee081611dff565b91506020830135611ef081611dff565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611f2257600080fd5b813567ffffffffffffffff80821115611f3d57611f3d611efb565b604051601f8301601f19908116603f01168101908282118183101715611f6557611f65611efb565b81604052838152866020858801011115611f7e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600080600060e0888a031215611fb957600080fd5b873567ffffffffffffffff80821115611fd157600080fd5b611fdd8b838c01611f11565b985060208a0135915080821115611ff357600080fd5b611fff8b838c01611f11565b975060408a013591508082111561201557600080fd5b6120218b838c01611f11565b965061202f60608b01611e14565b955061203d60808b01611e14565b945060a08a0135935060c08a013591508082111561205a57600080fd5b506120678a828b01611f11565b91505092959891949750929550565b6000806040838503121561208957600080fd5b823591506020830135611ef081611dff565b60208082526022908201527f446973636f756e74426f6e643a204d5553545f4245464f52455f4d4154555249604082015261545960f01b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561213c5761213c612114565b500390565b600181811c9082168061215557607f821691505b6020821081141561217657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f446973636f756e74426f6e643a20554e415554484f52495a4544000000000000604082015260600190565b600082198211156121c6576121c6612114565b500190565b6020808252601c908201527f446973636f756e74426f6e643a20414d4f554e545f544f4f5f4c4f5700000000604082015260600190565b60006020828403121561221457600080fd5b5051919050565b600081600019048311821515161561223557612235612114565b500290565b60008261225757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526024908201527f446973636f756e74426f6e643a20494e53554646494349454e545f4c495155496040820152634449545960e01b606082015260800190565b6000608082840312156122b257600080fd5b6040516080810181811067ffffffffffffffff821117156122d5576122d5611efb565b8060405250825181526020830151602082015260408301516040820152606083015160608201528091505092915050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156123b157600080fd5b8151801515811461072057600080fd5b600082516123d3818460208701611da0565b919091019291505056fea2646970667358221220f52284f9a20fe61006d00c8be9081e7d52b5d3f0adef6390748938fe6ade65d264736f6c63430008090033", "devdoc": { "kind": "dev", "methods": { @@ -827,6 +854,9 @@ "balanceOf(address)": { "details": "See {IERC20-balanceOf}." }, + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor" + }, "decimals()": { "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." }, @@ -953,15 +983,15 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 3097, + "astId": 3206, "contract": "contracts/DiscountBond.sol:DiscountBond", "label": "factory", "offset": 0, "slot": "151", - "type": "t_contract(IBondFactory)3756" + "type": "t_contract(IBondFactory)3897" }, { - "astId": 3100, + "astId": 3209, "contract": "contracts/DiscountBond.sol:DiscountBond", "label": "underlyingToken", "offset": 0, @@ -969,7 +999,7 @@ "type": "t_contract(IERC20Upgradeable)1000" }, { - "astId": 3102, + "astId": 3211, "contract": "contracts/DiscountBond.sol:DiscountBond", "label": "maturity", "offset": 0, @@ -977,7 +1007,7 @@ "type": "t_uint256" }, { - "astId": 3104, + "astId": 3213, "contract": "contracts/DiscountBond.sol:DiscountBond", "label": "series", "offset": 0, @@ -985,7 +1015,7 @@ "type": "t_string_storage" }, { - "astId": 3106, + "astId": 3215, "contract": "contracts/DiscountBond.sol:DiscountBond", "label": "inventoryAmount", "offset": 0, @@ -993,12 +1023,20 @@ "type": "t_uint256" }, { - "astId": 3108, + "astId": 3217, "contract": "contracts/DiscountBond.sol:DiscountBond", "label": "redeemedAmount", "offset": 0, "slot": "156", "type": "t_uint256" + }, + { + "astId": 3219, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "isin", + "offset": 0, + "slot": "157", + "type": "t_string_storage" } ], "types": { @@ -1030,7 +1068,7 @@ "label": "bool", "numberOfBytes": "1" }, - "t_contract(IBondFactory)3756": { + "t_contract(IBondFactory)3897": { "encoding": "inplace", "label": "contract IBondFactory", "numberOfBytes": "20" diff --git a/packages/bonds/deployments/bsctest/solcInputs/21f9402e2ca5f3597c1386289d997b81.json b/packages/bonds/deployments/bsctest/solcInputs/21f9402e2ca5f3597c1386289d997b81.json deleted file mode 100644 index f9b15b2..0000000 --- a/packages/bonds/deployments/bsctest/solcInputs/21f9402e2ca5f3597c1386289d997b81.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "contracts/BondFactory.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nimport \"./interfaces/IBondFactory.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./libs/Adminable.sol\";\nimport \"./libs/DuetTransparentUpgradeableProxy.sol\";\n\ncontract BondFactory is IBondFactory, Initializable, Adminable {\n /**\n * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%;\n * Calculation formula: x * percentage / PERCENTAGE_FACTOR\n */\n uint16 public constant PERCENTAGE_FACTOR = 10000;\n // kind => impl\n mapping(string => address) public bondImplementations;\n // kind => bond addresses\n mapping(string => address[]) public kindBondsMapping;\n // series => bond addresses\n mapping(string => address[]) public seriesBondsMapping;\n string[] public bondKinds;\n string[] public bondSeries;\n\n // bond => price\n mapping(address => uint256) public bondPrices;\n\n event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice);\n event BondImplementationUpdated(string kind, address implementation, address previousImplementation);\n event BondCreated(address bondToken);\n event BondRemoved(address bondToken);\n\n constructor() initializer {}\n\n function initialize(address admin_) public initializer {\n _setAdmin(admin_);\n }\n\n function createBond(\n string memory kind_,\n string memory name_,\n string memory symbol_,\n uint256 initialPrice_,\n uint256 initialGrant_,\n string memory series_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external onlyAdmin returns (address bondTokenAddress) {\n address proxyAdmin = address(this);\n address bondImpl = bondImplementations[kind_];\n require(bondImpl != address(0), \"BondFactory: Invalid bond implementation\");\n require(initialPrice_ > 0, \"BondFactory: INVALID_PRICE\");\n bytes memory proxyData;\n DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData);\n bondTokenAddress = address(proxy);\n IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_);\n if (seriesBondsMapping[series_].length == 0) {\n bondSeries.push(series_);\n }\n setPrice(bondTokenAddress, initialPrice_);\n if (initialGrant_ > 0) {\n grant(bondTokenAddress, initialGrant_);\n }\n seriesBondsMapping[series_].push(bondTokenAddress);\n kindBondsMapping[kind_].push(bondTokenAddress);\n emit BondCreated(bondTokenAddress);\n }\n\n function getBondKinds() external view returns (string[] memory) {\n return bondKinds;\n }\n\n function getKindBondLength(string memory kind_) external view returns (uint256) {\n return kindBondsMapping[kind_].length;\n }\n\n function getBondSeries() external view returns (string[] memory) {\n return bondSeries;\n }\n\n function getSeriesBondLength(string memory series_) external view returns (uint256) {\n return seriesBondsMapping[series_].length;\n }\n\n function setBondImplementation(\n string calldata kind_,\n address impl_,\n bool upgradeDeployed_\n ) external onlyAdmin {\n if (bondImplementations[kind_] == address(0)) {\n bondKinds.push(kind_);\n }\n emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]);\n bondImplementations[kind_] = impl_;\n if (!upgradeDeployed_) {\n return;\n }\n for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) {\n DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_);\n }\n }\n\n function setPrice(address bondToken_, uint256 price) public onlyAdmin {\n emit PriceUpdated(bondToken_, price, bondPrices[bondToken_]);\n bondPrices[bondToken_] = price;\n }\n\n function getPrice(address bondToken_) public view returns (uint256) {\n return bondPrices[bondToken_];\n }\n\n function priceDecimals() public view returns (uint256) {\n return 8;\n }\n\n function priceFactor() public view returns (uint256) {\n return 10**priceDecimals();\n }\n\n function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin {\n IBond(bondToken_).underlyingOut(amount_, msg.sender);\n }\n\n function grant(address bondToken_, uint256 amount_) public onlyAdmin {\n IBond(bondToken_).grant(amount_);\n }\n\n function removeBond(IBond bondToken_) external onlyAdmin {\n require(bondToken_.totalSupply() <= 0, \"BondFactory: CANT_REMOVE\");\n string memory kind = bondToken_.kind();\n string memory series = bondToken_.series();\n address bondTokenAddress = address(bondToken_);\n\n uint256 kindBondLength = kindBondsMapping[kind].length;\n for (uint256 i = 0; i < kindBondLength; i++) {\n if (kindBondsMapping[kind][i] != bondTokenAddress) {\n continue;\n }\n kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1];\n kindBondsMapping[kind].pop();\n }\n\n uint256 seriesBondLength = seriesBondsMapping[series].length;\n for (uint256 j = 0; j < seriesBondLength; j++) {\n if (seriesBondsMapping[series][j] != bondTokenAddress) {\n continue;\n }\n seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1];\n seriesBondsMapping[series].pop();\n }\n\n emit BondRemoved(bondTokenAddress);\n }\n\n function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) {\n // TODO\n return 0;\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" - }, - "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n */\n modifier initializer() {\n bool isTopLevelCall = _setInitializedVersion(1);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n * initialization step. This is essential to configure modules that are added through upgrades and that require\n * initialization.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n */\n modifier reinitializer(uint8 version) {\n bool isTopLevelCall = _setInitializedVersion(version);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(version);\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n */\n function _disableInitializers() internal virtual {\n _setInitializedVersion(type(uint8).max);\n }\n\n function _setInitializedVersion(uint8 version) private returns (bool) {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\n // of initializers, because in other contexts the contract may have been reentered.\n if (_initializing) {\n require(\n version == 1 && !AddressUpgradeable.isContract(address(this)),\n \"Initializable: contract is already initialized\"\n );\n return false;\n } else {\n require(_initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n return true;\n }\n }\n}\n" - }, - "contracts/interfaces/IBondFactory.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\ninterface IBondFactory {\n function priceFactor() external view returns (uint256);\n\n function getPrice(address bondToken_) external view returns (uint256 price);\n}\n" - }, - "contracts/interfaces/IBond.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface IBond is IERC20Upgradeable {\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external;\n\n function kind() external returns (string memory);\n\n function series() external returns (string memory);\n\n function underlyingOut(uint256 amount_, address to_) external;\n\n function grant(uint256 amount_) external;\n\n function faceValue(uint256 bondAmount_) external view returns (uint256);\n\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\n}\n" - }, - "contracts/libs/Adminable.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nabstract contract Adminable {\n event AdminUpdated(address indexed user, address indexed newAdmin);\n\n address public admin;\n\n modifier onlyAdmin() virtual {\n require(msg.sender == admin, \"UNAUTHORIZED\");\n\n _;\n }\n\n function setAdmin(address newAdmin) public virtual onlyAdmin {\n _setAdmin(newAdmin);\n }\n\n function _setAdmin(address newAdmin) internal {\n require(newAdmin != address(0), \"Can not set admin to zero address\");\n admin = newAdmin;\n\n emit AdminUpdated(msg.sender, newAdmin);\n }\n}\n" - }, - "contracts/libs/DuetTransparentUpgradeableProxy.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\nimport \"@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol\";\n\ncontract DuetTransparentUpgradeableProxy is TransparentUpgradeableProxy {\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable TransparentUpgradeableProxy(_logic, admin_, _data) {}\n\n /**\n * @dev override parent behavior to manage bonds fully in Factory\n *\n */\n function _beforeFallback() internal virtual override {}\n}\n" - }, - "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" - }, - "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _changeAdmin(admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\n */\n function changeAdmin(address newAdmin) external virtual ifAdmin {\n _changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n}\n" - }, - "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1));\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n" - }, - "@openzeppelin/contracts/proxy/Proxy.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overridden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" - }, - "@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\n // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Perform implementation upgrade\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeTo(address newImplementation) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n }\n\n /**\n * @dev Perform implementation upgrade with additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCall(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(newImplementation, data);\n }\n }\n\n /**\n * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n *\n * Emits an {Upgraded} event.\n */\n function _upgradeToAndCallUUPS(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n // Upgrades from old implementations will perform a rollback test. This test requires the new\n // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n // this special case will break upgrade paths from old UUPS implementation to new ones.\n if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n } catch {\n revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n }\n _upgradeToAndCall(newImplementation, data, forceCall);\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n * validated in the constructor.\n */\n bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n */\n function _changeAdmin(address newAdmin) internal {\n emit AdminChanged(_getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n */\n bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(_BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n require(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(\n Address.isContract(IBeacon(newBeacon).implementation()),\n \"ERC1967: beacon implementation is not a contract\"\n );\n StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n }\n\n /**\n * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n *\n * Emits a {BeaconUpgraded} event.\n */\n function _upgradeBeaconToAndCall(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/proxy/beacon/IBeacon.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {BeaconProxy} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n" - }, - "@openzeppelin/contracts/interfaces/draft-IERC1822.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n" - }, - "@openzeppelin/contracts/utils/Address.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCall(target, data, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/StorageSlot.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n}\n" - }, - "contracts/DiscountBond.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\n\nimport \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./interfaces/IBondFactory.sol\";\n\ncontract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n string public constant kind = \"Discount\";\n uint256 public constant MIN_TRADING_AMOUNT = 1e12;\n\n IBondFactory public factory;\n IERC20Upgradeable public underlyingToken;\n uint256 public maturity;\n string public series;\n uint256 public inventoryAmount;\n uint256 public redeemedAmount;\n\n event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondRedeemed(address indexed account, uint256 amount);\n event BondGranted(uint256 amount, uint256 inventoryAmount);\n\n constructor() initializer {}\n\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series_,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external initializer {\n __ERC20_init(name_, symbol_);\n __ReentrancyGuard_init();\n require(\n maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days),\n \"DiscountBond: INVALID_MATURITY\"\n );\n series = series_;\n underlyingToken = underlyingToken_;\n factory = IBondFactory(factory_);\n maturity = maturity_;\n }\n\n modifier beforeMaturity() {\n require(block.timestamp < maturity, \"DiscountBond: MUST_BEFORE_MATURITY\");\n _;\n }\n\n modifier afterMaturity() {\n require(block.timestamp >= maturity, \"DiscountBond: MUST_AFTER_MATURITY\");\n _;\n }\n\n modifier tradingGuard() {\n require(getPrice() > 0, \"INVALID_PRICE\");\n _;\n }\n\n modifier onlyFactory() {\n require(msg.sender == address(factory), \"DiscountBond: UNAUTHORIZED\");\n _;\n }\n\n /**\n * @dev grant specific amount of bond for user mint.\n */\n function grant(uint256 amount_) external onlyFactory {\n inventoryAmount += amount_;\n emit BondGranted(amount_, inventoryAmount);\n }\n\n function getPrice() public view returns (uint256) {\n return factory.getPrice(address(this));\n }\n\n function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_)\n external\n beforeMaturity\n returns (uint256 bondAmount)\n {\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_);\n bondAmount = previewMintByUnderlyingAmount(underlyingAmount_);\n inventoryAmount -= bondAmount;\n _mint(account_, bondAmount);\n emit BondMinted(account_, bondAmount, underlyingAmount_);\n }\n\n function previewMintByUnderlyingAmount(uint256 underlyingAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 bondAmount)\n {\n require(underlyingAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice();\n require(inventoryAmount >= bondAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function mintByBondAmount(address account_, uint256 bondAmount_)\n external\n beforeMaturity\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewMintByBondAmount(bondAmount_);\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount);\n inventoryAmount -= bondAmount_;\n _mint(account_, bondAmount_);\n emit BondMinted(account_, bondAmount_, underlyingAmount);\n }\n\n function previewMintByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(inventoryAmount >= bondAmount_, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n }\n\n function sellByBondAmount(uint256 bondAmount_)\n public\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewSellByBondAmount(bondAmount_);\n _burn(msg.sender, bondAmount_);\n inventoryAmount += bondAmount_;\n underlyingToken.safeTransfer(msg.sender, underlyingAmount);\n emit BondSold(msg.sender, bondAmount_, underlyingAmount);\n }\n\n function previewSellByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function redeem(uint256 bondAmount_) public {\n redeemFor(msg.sender, bondAmount_);\n }\n\n function faceValue(uint256 bondAmount_) public view returns (uint256) {\n return bondAmount_;\n }\n\n function amountToUnderlying(uint256 bondAmount_) public view returns (uint256) {\n if (block.timestamp >= maturity) {\n return faceValue(bondAmount_);\n }\n return (bondAmount_ * getPrice()) / factory.priceFactor();\n }\n\n function redeemFor(address account_, uint256 bondAmount_) public afterMaturity {\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n _burn(msg.sender, bondAmount_);\n redeemedAmount += bondAmount_;\n underlyingToken.safeTransfer(account_, bondAmount_);\n emit BondRedeemed(account_, bondAmount_);\n }\n\n /**\n * @notice\n */\n function underlyingOut(uint256 amount_, address to_) external onlyFactory {\n underlyingToken.safeTransfer(to_, amount_);\n }\n\n function emergencyWithdraw(\n IERC20Upgradeable token_,\n address to_,\n uint256 amount_\n ) external onlyFactory {\n token_.safeTransfer(to_, amount_);\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n function safeTransfer(\n IERC20Upgradeable token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20Upgradeable token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Upgradeable.sol\";\nimport \"./extensions/IERC20MetadataUpgradeable.sol\";\nimport \"../../utils/ContextUpgradeable.sol\";\nimport \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * The default value of {decimals} is 18. To select a different value for\n * {decimals} you should overload it.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing {\n __ERC20_init_unchained(name_, symbol_);\n }\n\n function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\n * overridden;\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n }\n _balances[to] += amount;\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n }\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(\n address owner,\n address spender,\n uint256 amount\n ) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal virtual {}\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[45] private __gap;\n}\n" - }, - "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n function __Pausable_init() internal onlyInitializing {\n __Pausable_init_unchained();\n }\n\n function __Pausable_init_unchained() internal onlyInitializing {\n _paused = false;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n require(!paused(), \"Pausable: paused\");\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n require(paused(), \"Pausable: not paused\");\n _;\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" - }, - "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuardUpgradeable is Initializable {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n function __ReentrancyGuard_init() internal onlyInitializing {\n __ReentrancyGuard_init_unchained();\n }\n\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n // On the first call to nonReentrant, _notEntered will be true\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n\n _;\n\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" - }, - "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20MetadataUpgradeable is IERC20Upgradeable {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" - }, - "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" - } - }, - "settings": { - "optimizer": { - "enabled": true, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "storageLayout", - "devdoc", - "userdoc", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - }, - "libraries": { - "": { - "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1" - } - } - } -} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/solcInputs/86b5d7bad88174195e885f97b1fed94c.json b/packages/bonds/deployments/bsctest/solcInputs/6a13f6e055440a5408c02b9e5d62636b.json similarity index 86% rename from packages/bonds/deployments/bsctest/solcInputs/86b5d7bad88174195e885f97b1fed94c.json rename to packages/bonds/deployments/bsctest/solcInputs/6a13f6e055440a5408c02b9e5d62636b.json index b657850..fc0005b 100644 --- a/packages/bonds/deployments/bsctest/solcInputs/86b5d7bad88174195e885f97b1fed94c.json +++ b/packages/bonds/deployments/bsctest/solcInputs/6a13f6e055440a5408c02b9e5d62636b.json @@ -2,7 +2,7 @@ "language": "Solidity", "sources": { "contracts/BondFactory.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nimport \"./interfaces/IBondFactory.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./libs/Adminable.sol\";\nimport \"./libs/DuetTransparentUpgradeableProxy.sol\";\n\ncontract BondFactory is IBondFactory, Initializable, Adminable {\n /**\n * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%;\n * Calculation formula: x * percentage / PERCENTAGE_FACTOR\n */\n uint16 public constant PERCENTAGE_FACTOR = 10000;\n // kind => impl\n mapping(string => address) public bondImplementations;\n // kind => bond addresses\n mapping(string => address[]) public kindBondsMapping;\n // series => bond addresses\n mapping(string => address[]) public seriesBondsMapping;\n string[] public bondKinds;\n string[] public bondSeries;\n\n // bond => price\n mapping(address => uint256) public bondPrices;\n\n event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice);\n event BondImplementationUpdated(string kind, address implementation, address previousImplementation);\n event BondCreated(address bondToken);\n event BondRemoved(address bondToken);\n\n constructor() initializer {}\n\n function initialize(address admin_) public initializer {\n _setAdmin(admin_);\n }\n\n function createBond(\n string memory kind_,\n string memory name_,\n string memory symbol_,\n uint256 initialPrice_,\n string memory series_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external onlyAdmin returns (address bondTokenAddress) {\n address proxyAdmin = address(this);\n address bondImpl = bondImplementations[kind_];\n require(bondImpl != address(0), \"BondFactory: Invalid bond implementation\");\n require(initialPrice_ > 0, \"BondFactory: INVALID_PRICE\");\n bytes memory proxyData;\n DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData);\n bondTokenAddress = address(proxy);\n IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_);\n if (seriesBondsMapping[series_].length == 0) {\n bondSeries.push(series_);\n }\n setPrice(bondTokenAddress, initialPrice_);\n seriesBondsMapping[series_].push(bondTokenAddress);\n kindBondsMapping[kind_].push(bondTokenAddress);\n emit BondCreated(bondTokenAddress);\n }\n\n function getBondKinds() external view returns (string[] memory) {\n return bondKinds;\n }\n\n function getKindBondLength(string memory kind_) external view returns (uint256) {\n return kindBondsMapping[kind_].length;\n }\n\n function getBondSeries() external view returns (string[] memory) {\n return bondSeries;\n }\n\n function getSeriesBondLength(string memory series_) external view returns (uint256) {\n return seriesBondsMapping[series_].length;\n }\n\n function setBondImplementation(\n string calldata kind_,\n address impl_,\n bool upgradeDeployed_\n ) external onlyAdmin {\n if (bondImplementations[kind_] == address(0)) {\n bondKinds.push(kind_);\n }\n emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]);\n bondImplementations[kind_] = impl_;\n if (!upgradeDeployed_) {\n return;\n }\n for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) {\n DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_);\n }\n }\n\n function setPrice(address bondToken_, uint256 price) public onlyAdmin {\n emit PriceUpdated(bondToken_, price, bondPrices[bondToken_]);\n bondPrices[bondToken_] = price;\n }\n\n function getPrice(address bondToken_) public view returns (uint256) {\n return bondPrices[bondToken_];\n }\n\n function priceDecimals() public view returns (uint256) {\n return 8;\n }\n\n function priceFactor() public view returns (uint256) {\n return 10**priceDecimals();\n }\n\n function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin {\n IBond(bondToken_).underlyingOut(amount_, msg.sender);\n }\n\n function grant(address bondToken_, uint256 amount_) external onlyAdmin {\n IBond(bondToken_).grant(amount_);\n }\n\n function removeBond(IBond bondToken_) external onlyAdmin {\n require(bondToken_.totalSupply() <= 0, \"BondFactory: CANT_REMOVE\");\n string memory kind = bondToken_.kind();\n string memory series = bondToken_.series();\n address bondTokenAddress = address(bondToken_);\n\n uint256 kindBondLength = kindBondsMapping[kind].length;\n for (uint256 i = 0; i < kindBondLength; i++) {\n if (kindBondsMapping[kind][i] != bondTokenAddress) {\n continue;\n }\n kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1];\n kindBondsMapping[kind].pop();\n }\n\n uint256 seriesBondLength = seriesBondsMapping[series].length;\n for (uint256 j = 0; j < seriesBondLength; j++) {\n if (seriesBondsMapping[series][j] != bondTokenAddress) {\n continue;\n }\n seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1];\n seriesBondsMapping[series].pop();\n }\n\n emit BondRemoved(bondTokenAddress);\n }\n\n function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) {\n // TODO\n return 0;\n }\n}\n" + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\nimport \"./interfaces/IBondFactory.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./libs/Adminable.sol\";\nimport \"./libs/DuetTransparentUpgradeableProxy.sol\";\n\ncontract BondFactory is IBondFactory, Initializable, Adminable {\n /**\n * @dev factor for percentage that described in integer. It makes 10000 means 100%, and 20 means 0.2%;\n * Calculation formula: x * percentage / PERCENTAGE_FACTOR\n */\n uint16 public constant PERCENTAGE_FACTOR = 10000;\n // kind => impl\n mapping(string => address) public bondImplementations;\n // kind => bond addresses\n mapping(string => address[]) public kindBondsMapping;\n // series => bond addresses\n mapping(string => address[]) public seriesBondsMapping;\n string[] public bondKinds;\n string[] public bondSeries;\n\n // isin => bond address\n mapping(string => address) public isinBondMapping;\n\n // bond => price\n mapping(address => BondPrice) public bondPrices;\n\n event PriceUpdated(address indexed bondToken, uint256 price, uint256 previousPrice);\n event BondImplementationUpdated(string kind, address implementation, address previousImplementation);\n event BondCreated(address bondToken);\n event BondRemoved(address bondToken);\n\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n function initialize(address admin_) public initializer {\n _setAdmin(admin_);\n }\n\n function verifyPrice(BondPrice memory price) public view returns (BondPrice memory) {\n require(\n price.price > 0 && price.bid > 0 && price.ask > 0 && price.ask >= price.bid,\n \"BondFactory: INVALID_PRICE\"\n );\n return price;\n }\n\n function createBond(\n string memory kind_,\n string memory name_,\n string memory symbol_,\n BondPrice calldata initialPrice_,\n uint256 initialGrant_,\n string memory series_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_,\n string memory isin_\n ) external onlyAdmin returns (address bondTokenAddress) {\n address proxyAdmin = address(this);\n address bondImpl = bondImplementations[kind_];\n require(bondImpl != address(0), \"BondFactory: Invalid bond implementation\");\n require(isinBondMapping[isin_] == address(0), \"A bond for this isin already exists\");\n verifyPrice(initialPrice_);\n bytes memory proxyData;\n DuetTransparentUpgradeableProxy proxy = new DuetTransparentUpgradeableProxy(bondImpl, proxyAdmin, proxyData);\n bondTokenAddress = address(proxy);\n IBond(bondTokenAddress).initialize(name_, symbol_, series_, address(this), underlyingToken_, maturity_, isin_);\n isinBondMapping[isin_] = bondTokenAddress;\n\n if (seriesBondsMapping[series_].length == 0) {\n bondSeries.push(series_);\n }\n setPrice(bondTokenAddress, initialPrice_.price, initialPrice_.bid, initialPrice_.ask);\n if (initialGrant_ > 0) {\n grant(bondTokenAddress, initialGrant_);\n }\n seriesBondsMapping[series_].push(bondTokenAddress);\n kindBondsMapping[kind_].push(bondTokenAddress);\n emit BondCreated(bondTokenAddress);\n }\n\n function getBondKinds() external view returns (string[] memory) {\n return bondKinds;\n }\n\n function getKindBondLength(string memory kind_) external view returns (uint256) {\n return kindBondsMapping[kind_].length;\n }\n\n function getBondSeries() external view returns (string[] memory) {\n return bondSeries;\n }\n\n function getSeriesBondLength(string memory series_) external view returns (uint256) {\n return seriesBondsMapping[series_].length;\n }\n\n function setBondImplementation(\n string calldata kind_,\n address impl_,\n bool upgradeDeployed_\n ) external onlyAdmin {\n if (bondImplementations[kind_] == address(0)) {\n bondKinds.push(kind_);\n }\n emit BondImplementationUpdated(kind_, impl_, bondImplementations[kind_]);\n bondImplementations[kind_] = impl_;\n if (!upgradeDeployed_) {\n return;\n }\n for (uint256 i = 0; i < kindBondsMapping[kind_].length; i++) {\n DuetTransparentUpgradeableProxy(payable(kindBondsMapping[kind_][i])).upgradeTo(impl_);\n }\n }\n\n function setPrice(\n address bondToken_,\n uint256 price,\n uint256 bid,\n uint256 ask\n ) public onlyAdmin {\n emit PriceUpdated(bondToken_, price, bondPrices[bondToken_].price);\n bondPrices[bondToken_] = BondPrice({ price: price, bid: bid, ask: ask, lastUpdated: block.timestamp });\n }\n\n function getPrice(address bondToken_) public view returns (BondPrice memory) {\n BondPrice memory price = bondPrices[bondToken_];\n verifyPrice(price);\n return price;\n }\n\n function priceDecimals() public view returns (uint256) {\n return 8;\n }\n\n function priceFactor() public view returns (uint256) {\n return 10**priceDecimals();\n }\n\n function underlyingOut(address bondToken_, uint256 amount_) external onlyAdmin {\n IBond(bondToken_).underlyingOut(amount_, msg.sender);\n }\n\n function grant(address bondToken_, uint256 amount_) public onlyAdmin {\n IBond(bondToken_).grant(amount_);\n }\n\n function removeBond(IBond bondToken_) external onlyAdmin {\n require(bondToken_.totalSupply() <= 0, \"BondFactory: CANT_REMOVE\");\n string memory kind = bondToken_.kind();\n string memory series = bondToken_.series();\n address bondTokenAddress = address(bondToken_);\n\n uint256 kindBondLength = kindBondsMapping[kind].length;\n for (uint256 i = 0; i < kindBondLength; i++) {\n if (kindBondsMapping[kind][i] != bondTokenAddress) {\n continue;\n }\n kindBondsMapping[kind][i] = kindBondsMapping[kind][kindBondLength - 1];\n kindBondsMapping[kind].pop();\n break;\n }\n\n uint256 seriesBondLength = seriesBondsMapping[series].length;\n for (uint256 j = 0; j < seriesBondLength; j++) {\n if (seriesBondsMapping[series][j] != bondTokenAddress) {\n continue;\n }\n seriesBondsMapping[series][j] = seriesBondsMapping[series][seriesBondLength - 1];\n seriesBondsMapping[series].pop();\n break;\n }\n\n delete isinBondMapping[bondToken_.isin()];\n\n emit BondRemoved(bondTokenAddress);\n }\n\n function calculateFee(string memory kind_, uint256 tradingAmount) public view returns (uint256) {\n // TODO\n return 0;\n }\n}\n" }, "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20Upgradeable {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(\n address from,\n address to,\n uint256 amount\n ) external returns (bool);\n}\n" @@ -11,10 +11,10 @@ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\n */\n modifier initializer() {\n bool isTopLevelCall = _setInitializedVersion(1);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\n * initialization step. This is essential to configure modules that are added through upgrades and that require\n * initialization.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n */\n modifier reinitializer(uint8 version) {\n bool isTopLevelCall = _setInitializedVersion(version);\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(version);\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n */\n function _disableInitializers() internal virtual {\n _setInitializedVersion(type(uint8).max);\n }\n\n function _setInitializedVersion(uint8 version) private returns (bool) {\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\n // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level\n // of initializers, because in other contexts the contract may have been reentered.\n if (_initializing) {\n require(\n version == 1 && !AddressUpgradeable.isContract(address(this)),\n \"Initializable: contract is already initialized\"\n );\n return false;\n } else {\n require(_initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n return true;\n }\n }\n}\n" }, "contracts/interfaces/IBondFactory.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\ninterface IBondFactory {\n function priceFactor() external view returns (uint256);\n\n function getPrice(address bondToken_) external view returns (uint256 price);\n}\n" + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\ninterface IBondFactory {\n struct BondPrice {\n uint256 price;\n uint256 bid;\n uint256 ask;\n uint256 lastUpdated;\n }\n\n function priceFactor() external view returns (uint256);\n\n function getPrice(address bondToken_) external view returns (BondPrice memory price);\n}\n" }, "contracts/interfaces/IBond.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface IBond is IERC20Upgradeable {\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external;\n\n function kind() external returns (string memory);\n\n function series() external returns (string memory);\n\n function underlyingOut(uint256 amount_, address to_) external;\n\n function grant(uint256 amount_) external;\n\n function faceValue(uint256 bondAmount_) external view returns (uint256);\n\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\n}\n" + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\n\ninterface IBond is IERC20Upgradeable {\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_,\n string memory isin_\n ) external;\n\n function kind() external returns (string memory);\n\n function series() external returns (string memory);\n\n function isin() external returns (string memory);\n\n function underlyingOut(uint256 amount_, address to_) external;\n\n function grant(uint256 amount_) external;\n\n function faceValue(uint256 bondAmount_) external view returns (uint256);\n\n function amountToUnderlying(uint256 bondAmount_) external view returns (uint256);\n}\n" }, "contracts/libs/Adminable.sol": { "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nabstract contract Adminable {\n event AdminUpdated(address indexed user, address indexed newAdmin);\n\n address public admin;\n\n modifier onlyAdmin() virtual {\n require(msg.sender == admin, \"UNAUTHORIZED\");\n\n _;\n }\n\n function setAdmin(address newAdmin) public virtual onlyAdmin {\n _setAdmin(newAdmin);\n }\n\n function _setAdmin(address newAdmin) internal {\n require(newAdmin != address(0), \"Can not set admin to zero address\");\n admin = newAdmin;\n\n emit AdminUpdated(msg.sender, newAdmin);\n }\n}\n" @@ -50,7 +50,7 @@ "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n assembly {\n r.slot := slot\n }\n }\n}\n" }, "contracts/DiscountBond.sol": { - "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\n\nimport \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./interfaces/IBondFactory.sol\";\n\ncontract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n string public constant kind = \"Discount\";\n uint256 public constant MIN_TRADING_AMOUNT = 1e12;\n\n IBondFactory public factory;\n IERC20Upgradeable public underlyingToken;\n uint256 public maturity;\n string public series;\n uint256 public inventoryAmount;\n uint256 public redeemedAmount;\n\n event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondRedeemed(address indexed account, uint256 amount);\n event BondGranted(uint256 amount, uint256 inventoryAmount);\n\n constructor() initializer {}\n\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series_,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_\n ) external initializer {\n __ERC20_init(name_, symbol_);\n __ReentrancyGuard_init();\n require(\n maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days),\n \"DiscountBond: INVALID_MATURITY\"\n );\n series = series_;\n underlyingToken = underlyingToken_;\n factory = IBondFactory(factory_);\n maturity = maturity_;\n }\n\n modifier beforeMaturity() {\n require(block.timestamp < maturity, \"DiscountBond: MUST_BEFORE_MATURITY\");\n _;\n }\n\n modifier afterMaturity() {\n require(block.timestamp >= maturity, \"DiscountBond: MUST_AFTER_MATURITY\");\n _;\n }\n\n modifier tradingGuard() {\n require(getPrice() > 0, \"INVALID_PRICE\");\n _;\n }\n\n modifier onlyFactory() {\n require(msg.sender == address(factory), \"DiscountBond: UNAUTHORIZED\");\n _;\n }\n\n /**\n * @dev grant specific amount of bond for user mint.\n */\n function grant(uint256 amount_) external onlyFactory {\n inventoryAmount += amount_;\n emit BondGranted(amount_, inventoryAmount);\n }\n\n function getPrice() public view returns (uint256) {\n return factory.getPrice(address(this));\n }\n\n function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_)\n external\n beforeMaturity\n returns (uint256 bondAmount)\n {\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_);\n bondAmount = previewMintByUnderlyingAmount(underlyingAmount_);\n inventoryAmount -= bondAmount;\n _mint(account_, bondAmount);\n emit BondMinted(account_, bondAmount, underlyingAmount_);\n }\n\n function previewMintByUnderlyingAmount(uint256 underlyingAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 bondAmount)\n {\n require(underlyingAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice();\n require(inventoryAmount >= bondAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function mintByBondAmount(address account_, uint256 bondAmount_)\n external\n beforeMaturity\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewMintByBondAmount(bondAmount_);\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount);\n inventoryAmount -= bondAmount_;\n _mint(account_, bondAmount_);\n emit BondMinted(account_, bondAmount_, underlyingAmount);\n }\n\n function previewMintByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(inventoryAmount >= bondAmount_, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n }\n\n function sellByBondAmount(uint256 bondAmount_)\n public\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewSellByBondAmount(bondAmount_);\n _burn(msg.sender, bondAmount_);\n inventoryAmount += bondAmount_;\n underlyingToken.safeTransfer(msg.sender, underlyingAmount);\n emit BondSold(msg.sender, bondAmount_, underlyingAmount);\n }\n\n function previewSellByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n underlyingAmount = (bondAmount_ * getPrice()) / factory.priceFactor();\n require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function redeem(uint256 bondAmount_) public {\n redeemFor(msg.sender, bondAmount_);\n }\n\n function faceValue(uint256 bondAmount_) public view returns (uint256) {\n return bondAmount_;\n }\n\n function amountToUnderlying(uint256 bondAmount_) public view returns (uint256) {\n if (block.timestamp >= maturity) {\n return faceValue(bondAmount_);\n }\n return (bondAmount_ * getPrice()) / factory.priceFactor();\n }\n\n function redeemFor(address account_, uint256 bondAmount_) public afterMaturity {\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n _burn(msg.sender, bondAmount_);\n redeemedAmount += bondAmount_;\n underlyingToken.safeTransfer(account_, bondAmount_);\n emit BondRedeemed(account_, bondAmount_);\n }\n\n /**\n * @notice\n */\n function underlyingOut(uint256 amount_, address to_) external onlyFactory {\n underlyingToken.safeTransfer(to_, amount_);\n }\n\n function emergencyWithdraw(\n IERC20Upgradeable token_,\n address to_,\n uint256 amount_\n ) external onlyFactory {\n token_.safeTransfer(to_, amount_);\n }\n}\n" + "content": "// SPDX-License-Identifier: GPL-3.0\npragma solidity 0.8.9;\n\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol\";\n\nimport \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\";\nimport \"./interfaces/IBond.sol\";\nimport \"./interfaces/IBondFactory.sol\";\n\ncontract DiscountBond is ERC20Upgradeable, ReentrancyGuardUpgradeable, IBond {\n using SafeERC20Upgradeable for IERC20Upgradeable;\n string public constant kind = \"Discount\";\n uint256 public constant MIN_TRADING_AMOUNT = 1e12;\n\n IBondFactory public factory;\n IERC20Upgradeable public underlyingToken;\n uint256 public maturity;\n string public series;\n uint256 public inventoryAmount;\n uint256 public redeemedAmount;\n string public isin;\n\n event BondMinted(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondSold(address indexed account, uint256 bondAmount, uint256 underlyingAmount);\n event BondRedeemed(address indexed account, uint256 amount);\n event BondGranted(uint256 amount, uint256 inventoryAmount);\n\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n function initialize(\n string memory name_,\n string memory symbol_,\n string memory series_,\n address factory_,\n IERC20Upgradeable underlyingToken_,\n uint256 maturity_,\n string memory isin_\n ) external initializer {\n __ERC20_init(name_, symbol_);\n __ReentrancyGuard_init();\n require(\n maturity_ > block.timestamp && maturity_ <= block.timestamp + (20 * 365 days),\n \"DiscountBond: INVALID_MATURITY\"\n );\n series = series_;\n underlyingToken = underlyingToken_;\n factory = IBondFactory(factory_);\n maturity = maturity_;\n isin = isin_;\n }\n\n modifier beforeMaturity() {\n require(block.timestamp < maturity, \"DiscountBond: MUST_BEFORE_MATURITY\");\n _;\n }\n\n modifier afterMaturity() {\n require(block.timestamp >= maturity, \"DiscountBond: MUST_AFTER_MATURITY\");\n _;\n }\n\n modifier tradingGuard() {\n _;\n }\n\n modifier onlyFactory() {\n require(msg.sender == address(factory), \"DiscountBond: UNAUTHORIZED\");\n _;\n }\n\n /**\n * @dev grant specific amount of bond for user mint.\n */\n function grant(uint256 amount_) external onlyFactory {\n inventoryAmount += amount_;\n emit BondGranted(amount_, inventoryAmount);\n }\n\n function getPrice() public view returns (IBondFactory.BondPrice memory) {\n return factory.getPrice(address(this));\n }\n\n function mintByUnderlyingAmount(address account_, uint256 underlyingAmount_)\n external\n beforeMaturity\n nonReentrant\n returns (uint256 bondAmount)\n {\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount_);\n bondAmount = previewMintByUnderlyingAmount(underlyingAmount_);\n inventoryAmount -= bondAmount;\n _mint(account_, bondAmount);\n emit BondMinted(account_, bondAmount, underlyingAmount_);\n }\n\n function previewMintByUnderlyingAmount(uint256 underlyingAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 bondAmount)\n {\n require(underlyingAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n bondAmount = (underlyingAmount_ * factory.priceFactor()) / getPrice().ask;\n require(inventoryAmount >= bondAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function mintByBondAmount(address account_, uint256 bondAmount_)\n external\n nonReentrant\n beforeMaturity\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewMintByBondAmount(bondAmount_);\n underlyingToken.safeTransferFrom(msg.sender, address(this), underlyingAmount);\n inventoryAmount -= bondAmount_;\n _mint(account_, bondAmount_);\n emit BondMinted(account_, bondAmount_, underlyingAmount);\n }\n\n function previewMintByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(inventoryAmount >= bondAmount_, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n underlyingAmount = (bondAmount_ * getPrice().ask) / factory.priceFactor();\n }\n\n function sellByBondAmount(uint256 bondAmount_)\n public\n beforeMaturity\n nonReentrant\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n underlyingAmount = previewSellByBondAmount(bondAmount_);\n _burn(msg.sender, bondAmount_);\n inventoryAmount += bondAmount_;\n underlyingToken.safeTransfer(msg.sender, underlyingAmount);\n emit BondSold(msg.sender, bondAmount_, underlyingAmount);\n }\n\n function previewSellByBondAmount(uint256 bondAmount_)\n public\n view\n beforeMaturity\n tradingGuard\n returns (uint256 underlyingAmount)\n {\n require(bondAmount_ >= MIN_TRADING_AMOUNT, \"DiscountBond: AMOUNT_TOO_LOW\");\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n underlyingAmount = (bondAmount_ * getPrice().bid) / factory.priceFactor();\n require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, \"DiscountBond: INSUFFICIENT_LIQUIDITY\");\n }\n\n function redeem(uint256 bondAmount_) public {\n redeemFor(msg.sender, bondAmount_);\n }\n\n function faceValue(uint256 bondAmount_) public view returns (uint256) {\n return bondAmount_;\n }\n\n function amountToUnderlying(uint256 bondAmount_) public view returns (uint256) {\n if (block.timestamp >= maturity) {\n return faceValue(bondAmount_);\n }\n return (bondAmount_ * getPrice().price) / factory.priceFactor();\n }\n\n function redeemFor(address account_, uint256 bondAmount_) public afterMaturity nonReentrant {\n require(balanceOf(msg.sender) >= bondAmount_, \"DiscountBond: EXCEEDS_BALANCE\");\n _burn(msg.sender, bondAmount_);\n redeemedAmount += bondAmount_;\n underlyingToken.safeTransfer(account_, bondAmount_);\n emit BondRedeemed(account_, bondAmount_);\n }\n\n /**\n * @notice\n */\n function underlyingOut(uint256 amount_, address to_) external onlyFactory {\n underlyingToken.safeTransfer(to_, amount_);\n }\n\n function emergencyWithdraw(\n IERC20Upgradeable token_,\n address to_,\n uint256 amount_\n ) external onlyFactory {\n token_.safeTransfer(to_, amount_);\n }\n}\n" }, "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20Upgradeable.sol\";\nimport \"../../../utils/AddressUpgradeable.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20Upgradeable {\n using AddressUpgradeable for address;\n\n function safeTransfer(\n IERC20Upgradeable token,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n }\n\n function safeTransferFrom(\n IERC20Upgradeable token,\n address from,\n address to,\n uint256 value\n ) internal {\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n }\n\n /**\n * @dev Deprecated. This function has issues similar to the ones found in\n * {IERC20-approve}, and its usage is discouraged.\n *\n * Whenever possible, use {safeIncreaseAllowance} and\n * {safeDecreaseAllowance} instead.\n */\n function safeApprove(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n // safeApprove should only be called when setting an initial allowance,\n // or when resetting it to zero. To increase and decrease it, use\n // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n require(\n (value == 0) || (token.allowance(address(this), spender) == 0),\n \"SafeERC20: approve from non-zero to non-zero allowance\"\n );\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n }\n\n function safeIncreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n uint256 newAllowance = token.allowance(address(this), spender) + value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n\n function safeDecreaseAllowance(\n IERC20Upgradeable token,\n address spender,\n uint256 value\n ) internal {\n unchecked {\n uint256 oldAllowance = token.allowance(address(this), spender);\n require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n uint256 newAllowance = oldAllowance - value;\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n }\n }\n\n /**\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n * on the return value: the return value is optional (but if data is returned, it must not be false).\n * @param token The token targeted by the call.\n * @param data The call data (encoded using abi.encode or one of its variants).\n */\n function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {\n // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n // the target address contains contract code and also asserts for success in the low-level call.\n\n bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n if (returndata.length > 0) {\n // Return data is optional\n require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n }\n }\n}\n" diff --git a/packages/bonds/hardhat.config.ts b/packages/bonds/hardhat.config.ts index 4433006..dd5fb80 100644 --- a/packages/bonds/hardhat.config.ts +++ b/packages/bonds/hardhat.config.ts @@ -79,8 +79,9 @@ const config: HardhatUserConfig = { : {}), }, bsctest: { - url: 'https://data-seed-prebsc-1-s3.binance.org:8545', + // url: 'https://data-seed-prebsc-1-s3.binance.org:8545', // url: 'https://data-seed-prebsc-1-s1.binance.org:8545/', + url: 'https://bsc-testnet.public.blastapi.io', chainId: 97, accounts: [process.env.KEY_BSC_TEST!], // for hardhat-eploy diff --git a/packages/bonds/test/DiscountBond.test.ts b/packages/bonds/test/DiscountBond.test.ts index 4ebf2a0..01d69cd 100644 --- a/packages/bonds/test/DiscountBond.test.ts +++ b/packages/bonds/test/DiscountBond.test.ts @@ -9,6 +9,13 @@ import { formatUnits, parseEther, parseUnits } from 'ethers/lib/utils' use(chaiAsPromised) +const MOCK_PRICE = { + price: parseUnits('0.98', 8), + bid: parseUnits('0.97', 8), + ask: parseUnits('0.99', 8), + lastUpdated: Math.floor(new Date().valueOf() / 1000), +} + describe('Bonds', function () { let bondFactory: BondFactory let usdcToken: MockERC20 @@ -17,9 +24,10 @@ describe('Bonds', function () { let admin: SignerWithAddress let alice: SignerWithAddress let bob: SignerWithAddress + let carol: SignerWithAddress before('Create bond', async () => { - ;[admin, alice, bob] = await ethers.getSigners() + ;[admin, alice, bob, carol] = await ethers.getSigners() const BondFactory = await ethers.getContractFactory('BondFactory') bondFactory = (await upgrades.deployProxy(BondFactory, [admin.address], { @@ -46,42 +54,67 @@ describe('Bonds', function () { 'Discount', 'dB26W001', 'T-Bills@26Weeks#001', - parseUnits('0.98', 8), + MOCK_PRICE, parseUnits('1000000', 18), 'USBills', usdcToken.address, maturityTime, + 'US912796YB94', ) const res = await tx.wait() - expect(res.events).to.not.eq(undefined) + expect(res.events).to.not.eq(undefined, 'After creating Bond, the events should not be empty.') if (!res.events) return const event = res.events.find((event) => event.event === 'BondCreated') - expect(event).to.not.eq(undefined) + expect(event).to.not.eq(undefined, 'After creating Bond, the BondCreated event should not be empty.') if (!event || !event.args) return const bondTokenAddress = event.args[0] - expect(bondTokenAddress).to.not.eq(undefined) + expect(bondTokenAddress).to.not.eq(undefined, 'After creating Bond, the bondTokenAddress should not be undefined.') bondToken = DiscountBond.attach(bondTokenAddress) await usdcToken.connect(alice).approve(bondToken.address, ethers.constants.MaxUint256) await usdcToken.connect(bob).approve(bondToken.address, ethers.constants.MaxUint256) // bondToken create success - expect(await bondToken.name()).to.equal('dB26W001') - expect(await bondToken.symbol()).to.equal('T-Bills@26Weeks#001') - expect(await bondToken.kind()).to.equal('Discount') - expect(await bondToken.series()).to.equal('USBills') - expect(await bondToken.getPrice()).to.equal(parseUnits('0.98', 8)) - expect(await bondToken.inventoryAmount()).to.equal(parseEther('1000000')) - expect(await bondToken.underlyingToken()).to.equal(usdcToken.address) - expect(+(await bondToken.maturity())).to.equal(maturityTime) + expect(await bondToken.name()).to.equal('dB26W001', "The bond's name should be set correctly.") + expect(await bondToken.symbol()).to.equal('T-Bills@26Weeks#001', "The bond's symbol should be set correctly.") + expect(await bondToken.kind()).to.equal('Discount', "The bond's kind should be set correctly.") + expect(await bondToken.series()).to.equal('USBills', "The bond's series should be set correctly.") + expect(await (await bondToken.getPrice()).price).to.equal( + parseUnits('0.98', 8), + "The bond's price should be set correctly.", + ) + expect(await bondToken.isin()).to.equal('US912796YB94', "The bond's isin should be set correctly.") + expect(await bondToken.inventoryAmount()).to.equal( + parseEther('1000000'), + 'The bond inventory amount should be set correctly.', + ) + expect(await bondToken.underlyingToken()).to.equal( + usdcToken.address, + "The bond's underlyingToken should be set correctly.", + ) + expect(+(await bondToken.maturity())).to.equal(maturityTime, "The bond's maturityTime should be set correctly.") + + expect(await bondFactory.isinBondMapping(await bondToken.isin())).to.equal( + bondToken.address, + 'it should able to get bond address by isin', + ) }) - it('admin should able to get/set price', async () => { - await bondFactory.connect(admin).setPrice(bondToken.address, parseUnits('0.64', 8)) - expect(formatUnits(await bondToken.getPrice(), 8)).to.equal('0.64') + it('admin/keeper should able to get/set price', async () => { + await bondFactory.connect(admin).setPrice(bondToken.address, MOCK_PRICE.price, MOCK_PRICE.bid, MOCK_PRICE.ask) + expect((await bondToken.getPrice()).price).to.equal(MOCK_PRICE.price, 'admin should be able to set price') + + await expect( + bondFactory.connect(carol).setPrice(bondToken.address, MOCK_PRICE.price, MOCK_PRICE.bid, MOCK_PRICE.ask), + ).to.be.revertedWith('UNAUTHORIZED') + + await bondFactory.setKeeper(carol.address) + + await bondFactory.connect(carol).setPrice(bondToken.address, parseUnits('9.2', 8), MOCK_PRICE.bid, MOCK_PRICE.ask) + expect((await bondToken.getPrice()).price).to.equal(parseUnits('9.2', 8), 'keeper should be able to set price') }) const shouldBuyBondCorrectly = async (user: SignerWithAddress, buyAmount: BigNumber) => { @@ -90,17 +123,25 @@ describe('Bonds', function () { const bondTokenOfAlice = await bondToken.balanceOf(user.address) const bondTokenOfInventory = await bondToken.inventoryAmount() - const price = await bondToken.getPrice() + const price = await (await bondToken.getPrice()).ask await bondToken.connect(user).mintByUnderlyingAmount(user.address, buyAmount) - expect(await usdcToken.balanceOf(user.address)).to.equal(usdcOfAlice.sub(buyAmount)) - expect(await usdcToken.balanceOf(bondToken.address)).to.equal(usdcOfBondToken.add(buyAmount)) + expect(await usdcToken.balanceOf(user.address)).to.equal( + usdcOfAlice.sub(buyAmount), + "After buying bond, user's underlying token balance should be correct", + ) + expect(await usdcToken.balanceOf(bondToken.address)).to.equal( + usdcOfBondToken.add(buyAmount), + "After buying bond, The bond contract's underlying token balance should be correct", + ) expect(await bondToken.balanceOf(user.address)).to.equal( bondTokenOfAlice.add(buyAmount.mul(parseUnits('1', 8)).div(price)), + "After buying bond, The user's bond token balance should be correct", ) expect(await bondToken.inventoryAmount()).to.equal( bondTokenOfInventory.sub(buyAmount.mul(parseUnits('1', 8)).div(price)), + "After buying bond, The bond token's inventoryAmount should be correct", ) } @@ -116,7 +157,10 @@ describe('Bonds', function () { const bondTokenOfInventory = await bondToken.inventoryAmount() await bondFactory.connect(admin).grant(bondToken.address, parseEther('1000000')) - expect(await bondToken.inventoryAmount()).to.equal(bondTokenOfInventory.add(parseEther('1000000'))) + expect(await bondToken.inventoryAmount()).to.equal( + bondTokenOfInventory.add(parseEther('1000000')), + 'It should be able to grant inventoryAmount', + ) await shouldBuyBondCorrectly(alice, parseEther('1200000')) }) @@ -128,18 +172,26 @@ describe('Bonds', function () { const usdcOfBondToken = await usdcToken.balanceOf(bondToken.address) const bondTokenOfAlice = await bondToken.balanceOf(alice.address) const bondTokenOfInventory = await bondToken.inventoryAmount() - const price = await bondToken.getPrice() + const price = await (await bondToken.getPrice()).bid await bondToken.connect(alice).sellByBondAmount(sellBondAmount) expect(await usdcToken.balanceOf(alice.address)).to.equal( usdcOfAlice.add(sellBondAmount.mul(price).div(parseUnits('1', 8))), + "After selling bond, user's underlying token balance should be correct", ) expect(await usdcToken.balanceOf(bondToken.address)).to.equal( usdcOfBondToken.sub(sellBondAmount.mul(price).div(parseUnits('1', 8))), + "After selling bond, The bond contract's underlying token balance should be correct", + ) + expect(await bondToken.balanceOf(alice.address)).to.equal( + bondTokenOfAlice.sub(sellBondAmount), + "After selling bond, The user's bond token balance should be correct", + ) + expect(await bondToken.inventoryAmount()).to.equal( + bondTokenOfInventory.add(sellBondAmount), + "After selling bond, The bond token's inventoryAmount should be correct", ) - expect(await bondToken.balanceOf(alice.address)).to.equal(bondTokenOfAlice.sub(sellBondAmount)) - expect(await bondToken.inventoryAmount()).to.equal(bondTokenOfInventory.add(sellBondAmount)) }) it(`user can't redeem before maturity time`, async () => { @@ -160,10 +212,22 @@ describe('Bonds', function () { await network.provider.send('evm_mine') await bondToken.connect(alice).redeem(redeemAmount) - expect(await usdcToken.balanceOf(alice.address)).to.equal(usdcOfAlice.add(redeemAmount)) - expect(await usdcToken.balanceOf(bondToken.address)).to.equal(usdcOfBondToken.sub(redeemAmount)) - expect(await bondToken.balanceOf(alice.address)).to.equal(bondTokenOfAlice.sub(redeemAmount)) - expect(await bondToken.redeemedAmount()).to.equal(bondTokenOfRedeemed.add(redeemAmount)) + expect(await usdcToken.balanceOf(alice.address)).to.equal( + usdcOfAlice.add(redeemAmount), + "After redeeming bond, user's underlying token balance should be correct", + ) + expect(await usdcToken.balanceOf(bondToken.address)).to.equal( + usdcOfBondToken.sub(redeemAmount), + "After redeeming bond, The bond contract's underlying token balance should be correct", + ) + expect(await bondToken.balanceOf(alice.address)).to.equal( + bondTokenOfAlice.sub(redeemAmount), + "After redeeming bond, The user's bond token balance should be correct", + ) + expect(await bondToken.redeemedAmount()).to.equal( + bondTokenOfRedeemed.add(redeemAmount), + "After redeeming bond, The bond token's redeemedAmount should be correct", + ) }) it(`admin withdraw half of the usdc of bond`, async () => { @@ -172,25 +236,35 @@ describe('Bonds', function () { const withdrawAmount = usdcOfBond.div(2) await bondFactory.connect(admin).underlyingOut(bondToken.address, withdrawAmount) - expect(await usdcToken.balanceOf(admin.address)).to.eq(usdcOfAdmin.add(withdrawAmount)) - expect(await usdcToken.balanceOf(bondToken.address)).to.eq(usdcOfBond.sub(withdrawAmount)) + expect(await usdcToken.balanceOf(admin.address)).to.eq( + usdcOfAdmin.add(withdrawAmount), + "After withdraw, the admin's underlying token balance should be correct", + ) + expect(await usdcToken.balanceOf(bondToken.address)).to.eq( + usdcOfBond.sub(withdrawAmount), + "After withdraw, the bond token contract's underlying token balance should be correct", + ) }) it(`should be able to remove bond`, async () => { const maturityTime = Math.floor(new Date().valueOf() / 1000) + 86400 * 40 - const tx = await bondFactory - .connect(admin) - .createBond( - 'Discount', - 'dB26W002', - 'T-Bills@26Weeks#002', - parseUnits('0.98', 8), - parseUnits('1000000', 18), - 'USBills', - usdcToken.address, - maturityTime, - ) + const tx = await bondFactory.connect(admin).createBond( + 'Discount', + 'dB26W002', + 'T-Bills@26Weeks#002', + { + price: parseUnits('0.98', 8), + bid: parseUnits('0.97', 8), + ask: parseUnits('0.99', 8), + lastUpdated: Math.floor(new Date().valueOf() / 1000), + }, + parseUnits('1000000', 18), + 'USBills', + usdcToken.address, + maturityTime, + 'US912828YW42', + ) const res = await tx.wait() expect(res.events).to.not.eq(undefined) @@ -206,10 +280,16 @@ describe('Bonds', function () { const DiscountBond = await ethers.getContractFactory('DiscountBond') const secondBondToken = DiscountBond.attach(bondTokenAddress) - expect(+(await bondFactory.getKindBondLength('Discount'))).to.eq(2) + expect(+(await bondFactory.getKindBondLength('Discount'))).to.eq( + 2, + 'After creating second bond, the kind length should be correct', + ) await bondFactory.connect(admin).removeBond(secondBondToken.address) - expect(+(await bondFactory.getKindBondLength('Discount'))).to.eq(1) + expect(+(await bondFactory.getKindBondLength('Discount'))).to.eq( + 1, + 'After removing, the kind length should be correct', + ) }) }) diff --git a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/CloneFactory.json b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/CloneFactory.json index 0b8c2ec..2bc65d7 100644 --- a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/CloneFactory.json +++ b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/CloneFactory.json @@ -1,4 +1,4 @@ { "class": "CloneFactory", "instance": "CloneFactory" -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DPPOracleAdminTemplate.json b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DPPOracleAdminTemplate.json index 508264d..b9d4077 100644 --- a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DPPOracleAdminTemplate.json +++ b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DPPOracleAdminTemplate.json @@ -1,4 +1,4 @@ { "class": "DPPOracleAdminTemplate", "instance": "DPPOracleAdminTemplate" -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DPPOracleTemplate.json b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DPPOracleTemplate.json index 5a9cfaf..ce2f80f 100644 --- a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DPPOracleTemplate.json +++ b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DPPOracleTemplate.json @@ -1,4 +1,4 @@ { "class": "DPPOracleTemplate", "instance": "DPPOracleTemplate" -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DodoOracle.json b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DodoOracle.json index 5fd427e..1985ca1 100644 --- a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DodoOracle.json +++ b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DodoOracle.json @@ -1,4 +1,4 @@ { "class": "DodoOracle", "instance": "DodoOracle" -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDPPFactory.json b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDPPFactory.json index 8dda600..7327cf1 100644 --- a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDPPFactory.json +++ b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDPPFactory.json @@ -1,4 +1,4 @@ { "class": "DuetDPPFactory", "instance": "DuetDPPFactory" -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDppControllerTemplate.json b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDppControllerTemplate.json index 43672c6..3020c7e 100644 --- a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDppControllerTemplate.json +++ b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDppControllerTemplate.json @@ -1,4 +1,4 @@ { "class": "DuetDppControllerTemplate", "instance": "DuetDppControllerTemplate" -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDppLpOracle.json b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDppLpOracle.json index 7f2d3a0..2acc998 100644 --- a/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDppLpOracle.json +++ b/packages/duet-dpp-admin/deployments/bsc/.extraMeta/DuetDppLpOracle.json @@ -1,4 +1,4 @@ { "class": "DuetDppLpOracle", "instance": "DuetDppLpOracle" -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/CloneFactory.json b/packages/duet-dpp-admin/deployments/bsc/CloneFactory.json index 2e4d4e5..19b9f28 100644 --- a/packages/duet-dpp-admin/deployments/bsc/CloneFactory.json +++ b/packages/duet-dpp-admin/deployments/bsc/CloneFactory.json @@ -57,4 +57,4 @@ "storage": [], "types": null } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DPPOracleAdminTemplate.json b/packages/duet-dpp-admin/deployments/bsc/DPPOracleAdminTemplate.json index 181edbc..a6bb1a1 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DPPOracleAdminTemplate.json +++ b/packages/duet-dpp-admin/deployments/bsc/DPPOracleAdminTemplate.json @@ -515,4 +515,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DPPOracleTemplate.json b/packages/duet-dpp-admin/deployments/bsc/DPPOracleTemplate.json index 1d431e7..beb5302 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DPPOracleTemplate.json +++ b/packages/duet-dpp-admin/deployments/bsc/DPPOracleTemplate.json @@ -1285,4 +1285,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DodoOracle.json b/packages/duet-dpp-admin/deployments/bsc/DodoOracle.json index 4c92ea1..09a68f7 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DodoOracle.json +++ b/packages/duet-dpp-admin/deployments/bsc/DodoOracle.json @@ -342,9 +342,7 @@ "blockNumber": 22364411, "transactionHash": "0xcd5252137dd89aad29e825baeca9bcd96616b54e30d4d8f13f7424c95a299e9b", "address": "0x43D3838D9eeA2f1f808634b61893fe0476BD582D", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 156, "blockHash": "0x7ae74f1866167ae7f68c815ff3c84e41ac197249d4c5ab5a6773655e6cb75564" @@ -395,4 +393,4 @@ "storage": [], "types": null } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DodoOracle_Implementation.json b/packages/duet-dpp-admin/deployments/bsc/DodoOracle_Implementation.json index 5e112c4..31fe00e 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DodoOracle_Implementation.json +++ b/packages/duet-dpp-admin/deployments/bsc/DodoOracle_Implementation.json @@ -264,4 +264,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DodoOracle_Proxy.json b/packages/duet-dpp-admin/deployments/bsc/DodoOracle_Proxy.json index 27752c7..0d9d1b0 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DodoOracle_Proxy.json +++ b/packages/duet-dpp-admin/deployments/bsc/DodoOracle_Proxy.json @@ -189,9 +189,7 @@ "blockNumber": 22364411, "transactionHash": "0xcd5252137dd89aad29e825baeca9bcd96616b54e30d4d8f13f7424c95a299e9b", "address": "0x43D3838D9eeA2f1f808634b61893fe0476BD582D", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 156, "blockHash": "0x7ae74f1866167ae7f68c815ff3c84e41ac197249d4c5ab5a6773655e6cb75564" @@ -241,4 +239,4 @@ "storage": [], "types": null } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory.json b/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory.json index 6e54c15..54b3ff4 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory.json +++ b/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory.json @@ -757,9 +757,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0xfb734cad8abd874e9213b56ecae5e39d9569bada1d76cd5f5938869bc34647fb" - ], + "topics": ["0xfb734cad8abd874e9213b56ecae5e39d9569bada1d76cd5f5938869bc34647fb"], "data": "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf", "logIndex": 184, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -769,9 +767,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x602109af93f127e29acf890713b5893218f7e26815fcf6217510271969a48741" - ], + "topics": ["0x602109af93f127e29acf890713b5893218f7e26815fcf6217510271969a48741"], "data": "0x00000000000000000000000018dfde99f578a0735410797e949e8d3e2afcb9d2", "logIndex": 185, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -781,9 +777,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x22e11bb50472c5926f73cb662487fea884eff39769745d27281599943f717c7f" - ], + "topics": ["0x22e11bb50472c5926f73cb662487fea884eff39769745d27281599943f717c7f"], "data": "0x000000000000000000000000b76de21f04f677f07d9881174a1d8e624276314c", "logIndex": 186, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -793,9 +787,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0xd005fff9c7f83c129aa07b4509db863643f2015e9ee77558797cd8b0d2b5c02a" - ], + "topics": ["0xd005fff9c7f83c129aa07b4509db863643f2015e9ee77558797cd8b0d2b5c02a"], "data": "0x000000000000000000000000bc395b08da32c97c1758ee5570a46e8af83ed5d0", "logIndex": 187, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -805,9 +797,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x004dd2c6ac11259cc04ebd830dcab6eeeab3cade0f03a429cdfc29492bccd0bb" - ], + "topics": ["0x004dd2c6ac11259cc04ebd830dcab6eeeab3cade0f03a429cdfc29492bccd0bb"], "data": "0x0000000000000000000000007e19936ef9dee072897974e69783a9708bd24a67", "logIndex": 188, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -817,9 +807,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x550115cbed277252b3735b4662f486e262dc4d072a8d43c6cc571cf2e641e236" - ], + "topics": ["0x550115cbed277252b3735b4662f486e262dc4d072a8d43c6cc571cf2e641e236"], "data": "0x00000000000000000000000093f6a67c581abaf49907f92b89f46fceadd32a2d", "logIndex": 189, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -829,9 +817,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 190, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -882,4 +868,4 @@ "storage": [], "types": null } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory_Implementation.json b/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory_Implementation.json index 6e0ead9..37ffa45 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory_Implementation.json +++ b/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory_Implementation.json @@ -591,9 +591,7 @@ "blockNumber": 22371531, "transactionHash": "0x92b4f8298f63579c9ffb7e8361218fa23ccc57dd235cb9a6765916d40b937555", "address": "0x8f4af03e392B32090837Abee892359106b062BFA", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 280, "blockHash": "0x4bf0c3f7956b090844f9e57844ad3b07508812ae61dc8829f5fe29936528ae13" @@ -781,4 +779,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory_Proxy.json b/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory_Proxy.json index 42c97dd..93377e5 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory_Proxy.json +++ b/packages/duet-dpp-admin/deployments/bsc/DuetDPPFactory_Proxy.json @@ -189,9 +189,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0xfb734cad8abd874e9213b56ecae5e39d9569bada1d76cd5f5938869bc34647fb" - ], + "topics": ["0xfb734cad8abd874e9213b56ecae5e39d9569bada1d76cd5f5938869bc34647fb"], "data": "0x00000000000000000000000000d7a6a2f161d3f4971a3d1b071ef55b284fd3bf", "logIndex": 184, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -201,9 +199,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x602109af93f127e29acf890713b5893218f7e26815fcf6217510271969a48741" - ], + "topics": ["0x602109af93f127e29acf890713b5893218f7e26815fcf6217510271969a48741"], "data": "0x00000000000000000000000018dfde99f578a0735410797e949e8d3e2afcb9d2", "logIndex": 185, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -213,9 +209,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x22e11bb50472c5926f73cb662487fea884eff39769745d27281599943f717c7f" - ], + "topics": ["0x22e11bb50472c5926f73cb662487fea884eff39769745d27281599943f717c7f"], "data": "0x000000000000000000000000b76de21f04f677f07d9881174a1d8e624276314c", "logIndex": 186, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -225,9 +219,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0xd005fff9c7f83c129aa07b4509db863643f2015e9ee77558797cd8b0d2b5c02a" - ], + "topics": ["0xd005fff9c7f83c129aa07b4509db863643f2015e9ee77558797cd8b0d2b5c02a"], "data": "0x000000000000000000000000bc395b08da32c97c1758ee5570a46e8af83ed5d0", "logIndex": 187, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -237,9 +229,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x004dd2c6ac11259cc04ebd830dcab6eeeab3cade0f03a429cdfc29492bccd0bb" - ], + "topics": ["0x004dd2c6ac11259cc04ebd830dcab6eeeab3cade0f03a429cdfc29492bccd0bb"], "data": "0x0000000000000000000000007e19936ef9dee072897974e69783a9708bd24a67", "logIndex": 188, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -249,9 +239,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x550115cbed277252b3735b4662f486e262dc4d072a8d43c6cc571cf2e641e236" - ], + "topics": ["0x550115cbed277252b3735b4662f486e262dc4d072a8d43c6cc571cf2e641e236"], "data": "0x00000000000000000000000093f6a67c581abaf49907f92b89f46fceadd32a2d", "logIndex": 189, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -261,9 +249,7 @@ "blockNumber": 22364405, "transactionHash": "0x1d78154655aacf69ceca532934a73139559f2e41e730f04367e432c30b76203a", "address": "0x1fE6a4004d72BD7124C95E5998CC31Af0f4113a8", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 190, "blockHash": "0x2bea0ef34f81d73703fa070e5b932c67aad7e5d6e60fe527fc9f0cf08e524652" @@ -313,4 +299,4 @@ "storage": [], "types": null } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DuetDppControllerTemplate.json b/packages/duet-dpp-admin/deployments/bsc/DuetDppControllerTemplate.json index 6583347..a8474e1 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DuetDppControllerTemplate.json +++ b/packages/duet-dpp-admin/deployments/bsc/DuetDppControllerTemplate.json @@ -1447,4 +1447,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle.json b/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle.json index 8961d0a..05d5496 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle.json +++ b/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle.json @@ -429,9 +429,7 @@ "blockNumber": 22371596, "transactionHash": "0x59dbd59d81da28a9b88a6ee1ed3c41b88c66367917c991a9357c4865d698a9b1", "address": "0x81A7F75494686728D2833C08F4AC5bC1847D30a4", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 257, "blockHash": "0xde5a17e09a4e5f8bc9a86b10d8cb6e17e9352f9cfb76caefa4a4a3f86b2cafaa" @@ -482,4 +480,4 @@ "storage": [], "types": null } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle_Implementation.json b/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle_Implementation.json index 6fa6b59..d9bec1a 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle_Implementation.json +++ b/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle_Implementation.json @@ -263,9 +263,7 @@ "blockNumber": 22447377, "transactionHash": "0xed674449dd3df8093722497a5a0f7fc8cc59cd4e9aaff672baae71031b6a7872", "address": "0x0E24dFb6C8CA1557922642eb58D7Ee9648eE0832", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 127, "blockHash": "0xd90ab630068c99b6fa3640ddb315ec1eb768050ee670558c9103801afe1b8c4a" @@ -372,4 +370,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle_Proxy.json b/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle_Proxy.json index 857abeb..f5b7e5f 100644 --- a/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle_Proxy.json +++ b/packages/duet-dpp-admin/deployments/bsc/DuetDppLpOracle_Proxy.json @@ -189,9 +189,7 @@ "blockNumber": 22371596, "transactionHash": "0x59dbd59d81da28a9b88a6ee1ed3c41b88c66367917c991a9357c4865d698a9b1", "address": "0x81A7F75494686728D2833C08F4AC5bC1847D30a4", - "topics": [ - "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" - ], + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "logIndex": 257, "blockHash": "0xde5a17e09a4e5f8bc9a86b10d8cb6e17e9352f9cfb76caefa4a4a3f86b2cafaa" @@ -241,4 +239,4 @@ "storage": [], "types": null } -} \ No newline at end of file +} From bf9ac11419e8b51da63f97559e744c310effc3f9 Mon Sep 17 00:00:00 2001 From: pandaomeng Date: Wed, 7 Dec 2022 00:03:55 +0800 Subject: [PATCH 6/6] test(bond): supplement complete unit test --- .../bonds/.openzeppelin/unknown-30097.json | 30 +- packages/bonds/package.json | 5 + packages/bonds/test/DiscountBond.test.ts | 100 +- pnpm-lock.yaml | 4001 +++++++++++++++-- 4 files changed, 3831 insertions(+), 305 deletions(-) diff --git a/packages/bonds/.openzeppelin/unknown-30097.json b/packages/bonds/.openzeppelin/unknown-30097.json index c9924e4..30d0cd1 100644 --- a/packages/bonds/.openzeppelin/unknown-30097.json +++ b/packages/bonds/.openzeppelin/unknown-30097.json @@ -2,7 +2,7 @@ "manifestVersion": "3.2", "admin": { "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "txHash": "0x508e40f16556f884efe9346aa064b7a944d968e11a6a0121f52c98c71fcce575" + "txHash": "0xc4d3d9ad77baaa62f3429744a1438145239fd53de92596935431d6f91a6195ab" }, "proxies": [ { @@ -32,14 +32,14 @@ }, { "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "txHash": "0x8db08f97a68f74991c7e5c1cbb862d976231c78e177e3af453b1af3a57321d24", + "txHash": "0xd0dc0b177a74a9907631d9a0e05b3ccdc15e348bb9ec512e8065b0904f89bd9b", "kind": "transparent" } ], "impls": { - "5e090fbf34371955420751650894c90591d3dbe577da9a0811bbffea02d2b7b4": { + "d6dd9459847f37380ff5e7fceffedeebc724a33cca181dec22a0292a171d0642": { "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "txHash": "0xc2a2c8b641bf548ca6b2bcf72ca6e252a7b7d8810c819c26ea4db229b3956bf3", + "txHash": "0xca8ba640e576e56338d999047475b90a027eae8c57099ed84d8f5e270cc5fa86", "layout": { "storage": [ { @@ -65,7 +65,7 @@ "slot": "0", "type": "t_address", "contract": "Adminable", - "src": "contracts/libs/Adminable.sol:7" + "src": "contracts/libs/Adminable.sol:11" }, { "label": "keeper", @@ -81,7 +81,7 @@ "slot": "2", "type": "t_mapping(t_string_memory_ptr,t_address)", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:20" + "src": "contracts/BondFactory.sol:24" }, { "label": "kindBondsMapping", @@ -89,7 +89,7 @@ "slot": "3", "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:22" + "src": "contracts/BondFactory.sol:26" }, { "label": "seriesBondsMapping", @@ -97,7 +97,7 @@ "slot": "4", "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:24" + "src": "contracts/BondFactory.sol:28" }, { "label": "bondKinds", @@ -105,7 +105,7 @@ "slot": "5", "type": "t_array(t_string_storage)dyn_storage", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:25" + "src": "contracts/BondFactory.sol:29" }, { "label": "bondSeries", @@ -113,7 +113,7 @@ "slot": "6", "type": "t_array(t_string_storage)dyn_storage", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:26" + "src": "contracts/BondFactory.sol:30" }, { "label": "isinBondMapping", @@ -121,15 +121,15 @@ "slot": "7", "type": "t_mapping(t_string_memory_ptr,t_address)", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:29" + "src": "contracts/BondFactory.sol:33" }, { "label": "bondPrices", "offset": 0, "slot": "8", - "type": "t_mapping(t_address,t_struct(BondPrice)3954_storage)", + "type": "t_mapping(t_address,t_struct(BondPrice)6000_storage)", "contract": "BondFactory", - "src": "contracts/BondFactory.sol:32" + "src": "contracts/BondFactory.sol:36" } ], "types": { @@ -149,7 +149,7 @@ "label": "bool", "numberOfBytes": "1" }, - "t_mapping(t_address,t_struct(BondPrice)3954_storage)": { + "t_mapping(t_address,t_struct(BondPrice)6000_storage)": { "label": "mapping(address => struct IBondFactory.BondPrice)", "numberOfBytes": "32" }, @@ -169,7 +169,7 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(BondPrice)3954_storage": { + "t_struct(BondPrice)6000_storage": { "label": "struct IBondFactory.BondPrice", "members": [ { diff --git a/packages/bonds/package.json b/packages/bonds/package.json index bcbffcc..2be55e7 100644 --- a/packages/bonds/package.json +++ b/packages/bonds/package.json @@ -33,5 +33,10 @@ "devDependencies": { "@private/shared": "workspace:*", "axios": "^0.27.2" + }, + "dependencies": { + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/solidity": "^5.7.0", + "@ethersproject/wallet": "^5.7.0" } } diff --git a/packages/bonds/test/DiscountBond.test.ts b/packages/bonds/test/DiscountBond.test.ts index 01d69cd..c4b41d5 100644 --- a/packages/bonds/test/DiscountBond.test.ts +++ b/packages/bonds/test/DiscountBond.test.ts @@ -9,6 +9,8 @@ import { formatUnits, parseEther, parseUnits } from 'ethers/lib/utils' use(chaiAsPromised) +const MOCK_MATURITY_TIME = Math.floor(new Date().valueOf() / 1000) + 86400 * 10 + const MOCK_PRICE = { price: parseUnits('0.98', 8), bid: parseUnits('0.97', 8), @@ -46,8 +48,6 @@ describe('Bonds', function () { // give 2,000,000 usdc to bob await usdcToken.connect(admin).transfer(bob.address, parseEther('1000000')) - const maturityTime = Math.floor(new Date().valueOf() / 1000) + 86400 * 10 - const tx = await bondFactory .connect(admin) .createBond( @@ -58,7 +58,7 @@ describe('Bonds', function () { parseUnits('1000000', 18), 'USBills', usdcToken.address, - maturityTime, + MOCK_MATURITY_TIME, 'US912796YB94', ) @@ -77,6 +77,10 @@ describe('Bonds', function () { await usdcToken.connect(alice).approve(bondToken.address, ethers.constants.MaxUint256) await usdcToken.connect(bob).approve(bondToken.address, ethers.constants.MaxUint256) + // console.log('first', usdcToken.allowance(bondToken.address, )) + }) + + it("bond token's attributes should be set correctly", async () => { // bondToken create success expect(await bondToken.name()).to.equal('dB26W001', "The bond's name should be set correctly.") expect(await bondToken.symbol()).to.equal('T-Bills@26Weeks#001', "The bond's symbol should be set correctly.") @@ -95,15 +99,62 @@ describe('Bonds', function () { usdcToken.address, "The bond's underlyingToken should be set correctly.", ) - expect(+(await bondToken.maturity())).to.equal(maturityTime, "The bond's maturityTime should be set correctly.") + expect(+(await bondToken.maturity())).to.equal( + MOCK_MATURITY_TIME, + "The bond's maturityTime should be set correctly.", + ) expect(await bondFactory.isinBondMapping(await bondToken.isin())).to.equal( bondToken.address, - 'it should able to get bond address by isin', + 'It should able to get bond address by isin', ) + + expect(await bondToken.factory()).to.eq(bondFactory.address, "Bond token's factory address should be right") + }) + + it('mintByBondAmount should be right', async () => { + const mintAmount = parseEther('8.2322') + + const usdcOfAlice = await usdcToken.balanceOf(alice.address) + const usdcOfBondToken = await usdcToken.balanceOf(bondToken.address) + const bondTokenOfAlice = await bondToken.balanceOf(alice.address) + const bondTokenOfInventory = await bondToken.inventoryAmount() + // const price = await (await bondToken.getPrice()).bid + + await bondToken.connect(alice).mintByBondAmount(alice.address, mintAmount) + + const underlyingAmount = await bondToken.previewMintByBondAmount(mintAmount) + + expect(await usdcToken.balanceOf(alice.address)).to.equal( + usdcOfAlice.sub(underlyingAmount), + "After minting bond, user's underlying token balance should be correct", + ) + expect(await usdcToken.balanceOf(bondToken.address)).to.equal( + usdcOfBondToken.add(underlyingAmount), + "After minting bond, The bond contract's underlying token balance should be correct", + ) + expect(await bondToken.balanceOf(alice.address)).to.equal( + bondTokenOfAlice.add(mintAmount), + "After minting bond, The user's bond token balance should be correct", + ) + expect(await bondToken.inventoryAmount()).to.equal( + bondTokenOfInventory.sub(mintAmount), + "After minting bond, The bond token's inventoryAmount should be correct", + ) + }) + + // it("Bond kinds' length / series' length should be right", async () => { + // bondFactory.bondKinds + // }) + + it(`previewMintByUnderlyingAmount should be right`, async () => { + const amount = parseUnits('2.3', 18) + const priceFactor = await bondFactory.priceFactor() + const ask = (await bondToken.getPrice()).ask + expect(await bondToken.previewMintByUnderlyingAmount(amount)).to.eq(amount.mul(priceFactor).div(ask)) }) - it('admin/keeper should able to get/set price', async () => { + it('Admin/keeper should able to get/set price', async () => { await bondFactory.connect(admin).setPrice(bondToken.address, MOCK_PRICE.price, MOCK_PRICE.bid, MOCK_PRICE.ask) expect((await bondToken.getPrice()).price).to.equal(MOCK_PRICE.price, 'admin should be able to set price') @@ -167,7 +218,6 @@ describe('Bonds', function () { it(`user can sell bond`, async () => { const sellBondAmount = parseEther('36.23832') - const usdcOfAlice = await usdcToken.balanceOf(alice.address) const usdcOfBondToken = await usdcToken.balanceOf(bondToken.address) const bondTokenOfAlice = await bondToken.balanceOf(alice.address) @@ -230,6 +280,34 @@ describe('Bonds', function () { ) }) + it(`user can redeem for another person`, async () => { + const redeemAmount = parseEther('200.48') + + const usdcOfBob = await usdcToken.balanceOf(bob.address) + const usdcOfBondToken = await usdcToken.balanceOf(bondToken.address) + const bondTokenOfAlice = await bondToken.balanceOf(alice.address) + const bondTokenOfRedeemed = await bondToken.redeemedAmount() + + await bondToken.connect(alice).redeemFor(bob.address, redeemAmount) + + expect(await usdcToken.balanceOf(bob.address)).to.equal( + usdcOfBob.add(redeemAmount), + "After redeeming bond, user's underlying token balance should be correct", + ) + expect(await usdcToken.balanceOf(bondToken.address)).to.equal( + usdcOfBondToken.sub(redeemAmount), + "After redeeming bond, The bond contract's underlying token balance should be correct", + ) + expect(await bondToken.balanceOf(alice.address)).to.equal( + bondTokenOfAlice.sub(redeemAmount), + "After redeeming bond, The user's bond token balance should be correct", + ) + expect(await bondToken.redeemedAmount()).to.equal( + bondTokenOfRedeemed.add(redeemAmount), + "After redeeming bond, The bond token's redeemedAmount should be correct", + ) + }) + it(`admin withdraw half of the usdc of bond`, async () => { const usdcOfBond = await usdcToken.balanceOf(bondToken.address) const usdcOfAdmin = await usdcToken.balanceOf(admin.address) @@ -280,6 +358,10 @@ describe('Bonds', function () { const DiscountBond = await ethers.getContractFactory('DiscountBond') const secondBondToken = DiscountBond.attach(bondTokenAddress) + expect(await bondFactory.isinBondMapping('US912828YW42')).to.eq( + bondTokenAddress, + 'Should be able to get bond address by isin', + ) expect(+(await bondFactory.getKindBondLength('Discount'))).to.eq( 2, 'After creating second bond, the kind length should be correct', @@ -287,6 +369,10 @@ describe('Bonds', function () { await bondFactory.connect(admin).removeBond(secondBondToken.address) + expect(await bondFactory.isinBondMapping('US912828YW42')).to.eq( + ethers.constants.AddressZero, + "Can't get address by isin after removing bond", + ) expect(+(await bondFactory.getKindBondLength('Discount'))).to.eq( 1, 'After removing, the kind length should be correct', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d65f997..ee85202 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,7 +121,7 @@ importers: eslint-plugin-prettier: 3.4.1_3tbgmemq3hdkydvpnqro4h7rs4 eslint-plugin-promise: 5.2.0_eslint@7.32.0 ethereum-waffle: 3.4.4_typescript@4.7.3 - ethers-multicall: 0.2.3_ethers@5.6.8 + ethers-multicall: 0.2.3 fs-extra: 10.1.0 glob: 8.0.3 hardhat-abi-exporter: 2.9.0_hardhat@2.9.9 @@ -181,6 +181,21 @@ importers: hardhat: registry.npmmirror.com/hardhat/2.9.9_typescript@4.7.3 typescript: 4.7.3 + packages/bonds: + specifiers: + '@ethersproject/contracts': ^5.7.0 + '@ethersproject/solidity': ^5.7.0 + '@ethersproject/wallet': ^5.7.0 + '@private/shared': workspace:* + axios: ^0.27.2 + dependencies: + '@ethersproject/contracts': registry.npmjs.org/@ethersproject/contracts/5.7.0 + '@ethersproject/solidity': registry.npmjs.org/@ethersproject/solidity/5.7.0 + '@ethersproject/wallet': registry.npmjs.org/@ethersproject/wallet/5.7.0 + devDependencies: + '@private/shared': link:../../shared + axios: registry.npmjs.org/axios/0.27.2 + packages/dAssets-liquidator: specifiers: '@openzeppelin/contracts': ^4.6.0 @@ -1227,13 +1242,6 @@ packages: regenerator-runtime: 0.13.9 dev: true - /@colors/colors/1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true - optional: true - /@cspotcode/source-map-support/0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -1320,7 +1328,7 @@ packages: dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 2.0.0_klwbm762ath5wqyvpnko75g7be + '@typechain/ethers-v5': 2.0.0_typechain@3.0.0 '@types/mkdirp': 0.5.2 '@types/node-fetch': 2.6.1 ethers: 5.6.8 @@ -2123,6 +2131,7 @@ packages: '@nomicfoundation/ethereumjs-tx': 4.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 ethereum-cryptography: 0.1.3 + dev: false /@nomicfoundation/ethereumjs-blockchain/6.0.0: resolution: {integrity: sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==} @@ -2142,12 +2151,14 @@ packages: memory-level: 1.0.0 transitivePeerDependencies: - supports-color + dev: false /@nomicfoundation/ethereumjs-common/3.0.0: resolution: {integrity: sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==} dependencies: '@nomicfoundation/ethereumjs-util': 8.0.0 crc-32: 1.2.2 + dev: false /@nomicfoundation/ethereumjs-ethash/2.0.0: resolution: {integrity: sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==} @@ -2159,6 +2170,7 @@ packages: abstract-level: 1.0.3 bigint-crypto-utils: 3.1.6 ethereum-cryptography: 0.1.3 + dev: false /@nomicfoundation/ethereumjs-evm/1.0.0: resolution: {integrity: sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==} @@ -2174,11 +2186,13 @@ packages: rustbn.js: 0.2.0 transitivePeerDependencies: - supports-color + dev: false /@nomicfoundation/ethereumjs-rlp/4.0.0: resolution: {integrity: sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==} engines: {node: '>=14'} hasBin: true + dev: false /@nomicfoundation/ethereumjs-statemanager/1.0.0: resolution: {integrity: sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==} @@ -2192,6 +2206,7 @@ packages: functional-red-black-tree: 1.0.1 transitivePeerDependencies: - supports-color + dev: false /@nomicfoundation/ethereumjs-trie/5.0.0: resolution: {integrity: sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==} @@ -2201,6 +2216,7 @@ packages: '@nomicfoundation/ethereumjs-util': 8.0.0 ethereum-cryptography: 0.1.3 readable-stream: 3.6.0 + dev: false /@nomicfoundation/ethereumjs-tx/4.0.0: resolution: {integrity: sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==} @@ -2210,6 +2226,7 @@ packages: '@nomicfoundation/ethereumjs-rlp': 4.0.0 '@nomicfoundation/ethereumjs-util': 8.0.0 ethereum-cryptography: 0.1.3 + dev: false /@nomicfoundation/ethereumjs-util/8.0.0: resolution: {integrity: sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==} @@ -2217,6 +2234,7 @@ packages: dependencies: '@nomicfoundation/ethereumjs-rlp': 4.0.0 ethereum-cryptography: 0.1.3 + dev: false /@nomicfoundation/ethereumjs-vm/6.0.0: resolution: {integrity: sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==} @@ -2240,101 +2258,23 @@ packages: rustbn.js: 0.2.0 transitivePeerDependencies: - supports-color - - /@nomicfoundation/solidity-analyzer-darwin-arm64/0.0.3: - resolution: {integrity: sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true - - /@nomicfoundation/solidity-analyzer-darwin-x64/0.0.3: - resolution: {integrity: sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@nomicfoundation/solidity-analyzer-freebsd-x64/0.0.3: - resolution: {integrity: sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - optional: true - - /@nomicfoundation/solidity-analyzer-linux-arm64-gnu/0.0.3: - resolution: {integrity: sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - - /@nomicfoundation/solidity-analyzer-linux-arm64-musl/0.0.3: - resolution: {integrity: sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - - /@nomicfoundation/solidity-analyzer-linux-x64-gnu/0.0.3: - resolution: {integrity: sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true - - /@nomicfoundation/solidity-analyzer-linux-x64-musl/0.0.3: - resolution: {integrity: sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true - - /@nomicfoundation/solidity-analyzer-win32-arm64-msvc/0.0.3: - resolution: {integrity: sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - optional: true - - /@nomicfoundation/solidity-analyzer-win32-ia32-msvc/0.0.3: - resolution: {integrity: sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true - - /@nomicfoundation/solidity-analyzer-win32-x64-msvc/0.0.3: - resolution: {integrity: sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true + dev: false /@nomicfoundation/solidity-analyzer/0.0.3: resolution: {integrity: sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==} engines: {node: '>= 12'} optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.0.3 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.0.3 - '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.0.3 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.0.3 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.0.3 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.0.3 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.0.3 - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.0.3 - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.0.3 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.0.3 + '@nomicfoundation/solidity-analyzer-darwin-arm64': registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/0.0.3 + '@nomicfoundation/solidity-analyzer-darwin-x64': registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/0.0.3 + '@nomicfoundation/solidity-analyzer-freebsd-x64': registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/0.0.3 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/0.0.3 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/0.0.3 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/0.0.3 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/0.0.3 + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/0.0.3 + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/0.0.3 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/0.0.3 + dev: false /@nomiclabs/hardhat-ethers/2.0.6_ethers@5.6.8+hardhat@2.9.9: resolution: {integrity: sha512-q2Cjp20IB48rEn2NPjR1qxsIQBvFVYW9rFRCFq+bC4RUrn1Ljz3g4wM8uSlgIBZYBi2JMXxmOzFqHraczxq4Ng==} @@ -2345,36 +2285,6 @@ packages: ethers: 5.6.8 hardhat: 2.9.9_3u6mezahkkqoy6xqszupxyezbi - /@nomiclabs/hardhat-ethers/2.0.6_s5khapt3hiekiyqewlrxpawunq: - resolution: {integrity: sha512-q2Cjp20IB48rEn2NPjR1qxsIQBvFVYW9rFRCFq+bC4RUrn1Ljz3g4wM8uSlgIBZYBi2JMXxmOzFqHraczxq4Ng==} - peerDependencies: - ethers: ^5.0.0 - hardhat: ^2.0.0 - dependencies: - ethers: 5.6.8 - hardhat: 2.11.1 - dev: true - - /@nomiclabs/hardhat-etherscan/3.1.0_hardhat@2.11.1: - resolution: {integrity: sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA==} - peerDependencies: - hardhat: ^2.0.4 - dependencies: - '@ethersproject/abi': 5.6.3 - '@ethersproject/address': 5.6.1 - cbor: 5.2.0 - chalk: 2.4.2 - debug: 4.3.4 - fs-extra: 7.0.1 - hardhat: 2.11.1 - lodash: 4.17.21 - semver: 6.3.0 - table: 6.8.0 - undici: 5.5.1 - transitivePeerDependencies: - - supports-color - dev: true - /@nomiclabs/hardhat-etherscan/3.1.0_hardhat@2.9.9: resolution: {integrity: sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA==} peerDependencies: @@ -2448,11 +2358,11 @@ packages: '@nomiclabs/harhdat-etherscan': optional: true dependencies: - '@nomiclabs/hardhat-ethers': 2.0.6_s5khapt3hiekiyqewlrxpawunq - '@nomiclabs/hardhat-etherscan': 3.1.0_hardhat@2.11.1 + '@nomiclabs/hardhat-ethers': registry.npmjs.org/@nomiclabs/hardhat-ethers/2.0.6_s5khapt3hiekiyqewlrxpawunq + '@nomiclabs/hardhat-etherscan': registry.npmjs.org/@nomiclabs/hardhat-etherscan/3.1.0_hardhat@2.11.1 '@openzeppelin/upgrades-core': 1.15.0 chalk: 4.1.2 - hardhat: 2.11.1 + hardhat: registry.npmjs.org/hardhat/2.11.1 proper-lockfile: 4.1.2 transitivePeerDependencies: - supports-color @@ -2805,14 +2715,16 @@ packages: /@tsconfig/node16/1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} - /@typechain/ethers-v5/2.0.0_klwbm762ath5wqyvpnko75g7be: + /@typechain/ethers-v5/2.0.0_typechain@3.0.0: resolution: {integrity: sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==} peerDependencies: - ethers: ^5.0.0 typechain: ^3.0.0 dependencies: - ethers: 5.6.8 + ethers: registry.npmjs.org/ethers/5.6.8 typechain: 3.0.0_typescript@4.7.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate dev: true /@typechain/ethers-v5/7.2.0_hayrp22g2rnmipiay2ycaub4vy: @@ -2853,6 +2765,7 @@ packages: /@types/async-eventemitter/0.2.1: resolution: {integrity: sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==} + dev: false /@types/bn.js/4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} @@ -3164,6 +3077,7 @@ packages: level-transcoder: 1.0.1 module-error: 1.0.2 queue-microtask: 1.2.3 + dev: false /abstract-leveldown/2.6.3: resolution: {integrity: sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==} @@ -3564,14 +3478,14 @@ packages: /axios/0.21.4_debug@4.3.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.1 + follow-redirects: 1.15.1_debug@4.3.4 transitivePeerDependencies: - debug /axios/0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: - follow-redirects: 1.15.1 + follow-redirects: 1.15.1_debug@4.3.4 form-data: 4.0.0 transitivePeerDependencies: - debug @@ -3605,7 +3519,7 @@ packages: path-is-absolute: 1.0.1 private: 0.1.8 slash: 1.0.0 - source-map: 0.5.7 + source-map: registry.npmjs.org/source-map/0.5.7 transitivePeerDependencies: - supports-color dev: true @@ -3619,7 +3533,7 @@ packages: detect-indent: 4.0.0 jsesc: 1.3.0 lodash: 4.17.21 - source-map: 0.5.7 + source-map: registry.npmjs.org/source-map/0.5.7 trim-right: 1.0.1 dev: true @@ -4147,10 +4061,12 @@ packages: engines: {node: '>=10.4.0'} dependencies: bigint-mod-arith: 3.1.1 + dev: false /bigint-mod-arith/3.1.1: resolution: {integrity: sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==} engines: {node: '>=10.4.0'} + dev: false /bignumber.js/7.2.1: resolution: {integrity: sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==} @@ -4263,6 +4179,7 @@ packages: catering: 2.1.1 module-error: 1.0.2 run-parallel-limit: 1.1.0 + dev: false /browser-stdout/1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} @@ -4482,6 +4399,7 @@ packages: /catering/2.1.1: resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} engines: {node: '>=6'} + dev: false /cbor/5.2.0: resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} @@ -4632,7 +4550,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.2.0 optionalDependencies: - fsevents: 2.1.3 + fsevents: registry.npmjs.org/fsevents/2.1.3 /chokidar/3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} @@ -4646,7 +4564,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: registry.npmjs.org/fsevents/2.3.2 /chownr/1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -4697,6 +4615,7 @@ packages: module-error: 1.0.2 napi-macros: 2.0.0 node-gyp-build: 4.4.0 + dev: false /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} @@ -4716,7 +4635,7 @@ packages: object-assign: 4.1.1 string-width: 2.1.1 optionalDependencies: - colors: 1.4.0 + colors: registry.npmjs.org/colors/1.4.0 /cli-table3/0.6.2: resolution: {integrity: sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==} @@ -4724,7 +4643,7 @@ packages: dependencies: string-width: 4.2.3 optionalDependencies: - '@colors/colors': 1.5.0 + '@colors/colors': registry.npmjs.org/@colors/colors/1.5.0 dev: true /cli-width/2.2.1: @@ -5160,6 +5079,7 @@ packages: dependencies: ms: 2.1.2 supports-color: 8.1.1 + dev: false /decamelize/1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} @@ -5611,7 +5531,7 @@ packages: esutils: 2.0.3 optionator: 0.8.3 optionalDependencies: - source-map: 0.2.0 + source-map: registry.npmjs.org/source-map/0.2.0 dev: true /eslint-config-prettier/8.5.0_eslint@7.32.0: @@ -6349,28 +6269,13 @@ packages: util.promisify: 1.1.1 dev: true - /ethereumjs-wallet/0.6.5: - resolution: {integrity: sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==} - requiresBuild: true - dependencies: - aes-js: registry.npmmirror.com/aes-js/3.1.2 - bs58check: registry.npmmirror.com/bs58check/2.1.2 - ethereum-cryptography: registry.npmmirror.com/ethereum-cryptography/0.1.3 - ethereumjs-util: registry.npmmirror.com/ethereumjs-util/6.2.1 - randombytes: registry.npmmirror.com/randombytes/2.1.0 - safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 - scryptsy: registry.npmmirror.com/scryptsy/1.2.1 - utf8: registry.npmmirror.com/utf8/3.0.0 - uuid: registry.npmmirror.com/uuid/3.4.0 - dev: true - optional: true - - /ethers-multicall/0.2.3_ethers@5.6.8: + /ethers-multicall/0.2.3: resolution: {integrity: sha512-RaWQuLy+HzeKOibptlc9RZ6j7bT1H6VnkdAKTHiLx2t/lpyfS2ckXHdQhhRbCaXNc1iu6CgoisgMejxKHg84tg==} - peerDependencies: - ethers: ^5.0.0 dependencies: - ethers: 5.6.8 + ethers: registry.npmjs.org/ethers/5.6.8 + transitivePeerDependencies: + - bufferutil + - utf-8-validate dev: true /ethers/4.0.49: @@ -6834,6 +6739,7 @@ packages: peerDependenciesMeta: debug: optional: true + dev: true /follow-redirects/1.15.1_debug@4.3.4: resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} @@ -6933,7 +6839,7 @@ packages: /fs-extra/4.0.3: resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} dependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 jsonfile: 4.0.0 universalify: 0.1.2 dev: true @@ -6977,21 +6883,6 @@ packages: /fs.realpath/1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents/2.1.3: - resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - deprecated: '"Please update to latest v2.3 or v2.2"' - requiresBuild: true - optional: true - - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} @@ -7043,8 +6934,8 @@ packages: web3-provider-engine: 14.2.1 websocket: 1.0.32 optionalDependencies: - ethereumjs-wallet: 0.6.5 - web3: 1.2.11 + ethereumjs-wallet: registry.npmjs.org/ethereumjs-wallet/0.6.5 + web3: registry.npmjs.org/web3/1.2.11 transitivePeerDependencies: - bufferutil - encoding @@ -7302,7 +7193,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.16.0 + uglify-js: registry.npmjs.org/uglify-js/3.16.0 dev: true /har-schema/2.0.0: @@ -7457,6 +7348,7 @@ packages: - bufferutil - supports-color - utf-8-validate + dev: false /hardhat/2.9.9: resolution: {integrity: sha512-Qv7SXnRc0zq1kGXruNnSKpP3eFccXMR5Qv6GVX9hBIJ5efN0PflKPq92aQ5Cv3jrjJeRevLznWZVz7bttXhVfw==} @@ -8397,19 +8289,19 @@ packages: /jsonfile/2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 /jsonfile/4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 /jsonfile/6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 /jsonify/0.0.0: resolution: {integrity: sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==} @@ -8476,7 +8368,7 @@ packages: /klaw/1.3.1: resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 /lcid/1.0.0: resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} @@ -8606,6 +8498,7 @@ packages: /level-supports/4.0.1: resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} engines: {node: '>=12'} + dev: false /level-transcoder/1.0.1: resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} @@ -8613,6 +8506,7 @@ packages: dependencies: buffer: 6.0.3 module-error: 1.0.2 + dev: false /level-ws/0.0.0: resolution: {integrity: sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==} @@ -8644,6 +8538,7 @@ packages: dependencies: browser-level: 1.0.1 classic-level: 1.2.0 + dev: false /levelup/1.3.9: resolution: {integrity: sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==} @@ -8697,7 +8592,7 @@ packages: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 @@ -8909,6 +8804,7 @@ packages: abstract-level: 1.0.3 functional-red-black-tree: 1.0.1 module-error: 1.0.2 + dev: false /memorystream/0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} @@ -9058,6 +8954,7 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 + dev: false /minimatch/5.1.0: resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} @@ -9149,6 +9046,7 @@ packages: yargs: 16.2.0 yargs-parser: 5.0.1 yargs-unparser: 2.0.0 + dev: false /mocha/7.2.0: resolution: {integrity: sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==} @@ -9217,6 +9115,7 @@ packages: /module-error/1.0.2: resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} engines: {node: '>=10'} + dev: false /moment-timezone/0.5.34: resolution: {integrity: sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==} @@ -9308,6 +9207,7 @@ packages: resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: false /nanomatch/1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} @@ -9330,6 +9230,7 @@ packages: /napi-macros/2.0.0: resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==} + dev: false /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -9857,7 +9758,7 @@ packages: resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} engines: {node: '>=0.10.0'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 pify: 2.3.0 pinkie-promise: 2.0.1 dev: true @@ -9967,14 +9868,6 @@ packages: string-width: 4.2.3 dev: true - /prettier/1.19.1: - resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} - engines: {node: '>=4'} - hasBin: true - requiresBuild: true - dev: true - optional: true - /prettier/2.7.0: resolution: {integrity: sha512-nwoX4GMFgxoPC6diHvSwmK/4yU8FFH3V8XWtLQrbj4IBsK2pkYhG4kf/ljF/haaZ/aii+wNJqISrCDPgxGWDVQ==} engines: {node: '>=10.13.0'} @@ -10521,6 +10414,7 @@ packages: resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} dependencies: queue-microtask: 1.2.3 + dev: false /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -10852,7 +10746,7 @@ packages: define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 - source-map: 0.5.7 + source-map: registry.npmjs.org/source-map/0.5.7 source-map-resolve: 0.5.3 use: 3.1.1 transitivePeerDependencies: @@ -10930,7 +10824,7 @@ packages: lodash: 4.17.21 semver: 6.3.0 optionalDependencies: - prettier: 1.19.1 + prettier: registry.npmjs.org/prettier/1.19.1 transitivePeerDependencies: - supports-color dev: true @@ -10954,7 +10848,7 @@ packages: lodash: 4.17.21 semver: 6.3.0 optionalDependencies: - prettier: 1.19.1 + prettier: registry.npmjs.org/prettier/1.19.1 transitivePeerDependencies: - supports-color dev: true @@ -11019,7 +10913,7 @@ packages: /source-map-support/0.4.18: resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} dependencies: - source-map: 0.5.7 + source-map: registry.npmjs.org/source-map/0.5.7 dev: true /source-map-support/0.5.12: @@ -11040,20 +10934,6 @@ packages: deprecated: See https://github.com/lydell/source-map-url#deprecated dev: true - /source-map/0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} - requiresBuild: true - dependencies: - amdefine: 1.0.1 - dev: true - optional: true - - /source-map/0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: true - /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -11550,7 +11430,7 @@ packages: peerDependencies: typescript: '>=3.7.0' dependencies: - typescript: registry.npmmirror.com/typescript/4.7.3 + typescript: 4.7.3 dev: true /ts-essentials/7.0.3_typescript@4.7.3: @@ -11571,7 +11451,7 @@ packages: chalk: 2.4.2 glob: 7.2.3 mkdirp: 0.5.6 - prettier: 2.7.0 + prettier: registry.npmjs.org/prettier/2.7.0 resolve: 1.22.0 ts-essentials: 1.0.4 dev: true @@ -11803,14 +11683,6 @@ packages: resolution: {integrity: sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==} dev: true - /uglify-js/3.16.0: - resolution: {integrity: sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - /ultron/1.1.1: resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} dev: true @@ -12521,25 +12393,6 @@ packages: utf8: 3.0.0 dev: true - /web3/1.2.11: - resolution: {integrity: sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==} - engines: {node: '>=8.0.0'} - requiresBuild: true - dependencies: - web3-bzz: registry.npmmirror.com/web3-bzz/1.2.11 - web3-core: registry.npmmirror.com/web3-core/1.2.11 - web3-eth: registry.npmmirror.com/web3-eth/1.2.11 - web3-eth-personal: registry.npmmirror.com/web3-eth-personal/1.2.11 - web3-net: registry.npmmirror.com/web3-net/1.2.11 - web3-shh: registry.npmmirror.com/web3-shh/1.2.11 - web3-utils: registry.npmmirror.com/web3-utils/1.2.11 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - optional: true - /web3/1.5.3: resolution: {integrity: sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w==} engines: {node: '>=8.0.0'} @@ -12685,6 +12538,7 @@ packages: /workerpool/6.2.1: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + dev: false /wrap-ansi/2.1.0: resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} @@ -12933,32 +12787,3610 @@ packages: name: ethereumjs-abi version: 0.6.8 dependencies: - bn.js: 4.12.0 - ethereumjs-util: 6.2.1 + bn.js: registry.npmjs.org/bn.js/4.12.0 + ethereumjs-util: registry.npmjs.org/ethereumjs-util/6.2.1 dev: true - registry.npmmirror.com/@chainlink/contracts/0.4.0: - resolution: {integrity: sha512-yZGeCBd7d+qxfw9r/JxtPzsW2kCc6MorPRZ/tDKnaJI98H99j5P2Fosfehmcwk6wVZlz+0Bp4kS1y480nw3Zow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@chainlink/contracts/-/contracts-0.4.0.tgz} - name: '@chainlink/contracts' - version: 0.4.0 - dev: false + registry.npmjs.org/@colors/colors/1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz} + name: '@colors/colors' + version: 1.5.0 + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: true + optional: true - registry.npmmirror.com/@ensdomains/ens/0.4.5: - resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ensdomains/ens/-/ens-0.4.5.tgz} - name: '@ensdomains/ens' - version: 0.4.5 - deprecated: Please use @ensdomains/ens-contracts + registry.npmjs.org/@ethersproject/abi/5.6.3: + resolution: {integrity: sha512-CxKTdoZY4zDJLWXG6HzNH6znWK0M79WzzxHegDoecE3+K32pzfHOzuXg2/oGSTecZynFgpkjYXNPOqXVJlqClw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/abi/-/abi-5.6.3.tgz} + name: '@ethersproject/abi' + version: 5.6.3 dependencies: - bluebird: registry.npmmirror.com/bluebird/3.7.2 - eth-ens-namehash: registry.npmmirror.com/eth-ens-namehash/2.0.8 - solc: registry.npmmirror.com/solc/0.4.26 - testrpc: registry.npmmirror.com/testrpc/0.0.1 - web3-utils: registry.npmmirror.com/web3-utils/1.7.3 - dev: true + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.6.1 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.6.2 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.6.1 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.6.1 + '@ethersproject/hash': registry.npmjs.org/@ethersproject/hash/5.6.1 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.6.1 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.6.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.6.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.6.1 + + registry.npmjs.org/@ethersproject/abi/5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz} + name: '@ethersproject/abi' + version: 5.7.0 + dependencies: + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.7.0 + '@ethersproject/hash': registry.npmjs.org/@ethersproject/hash/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + + registry.npmjs.org/@ethersproject/abstract-provider/5.6.1: + resolution: {integrity: sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz} + name: '@ethersproject/abstract-provider' + version: 5.6.1 + dependencies: + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.6.2 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.6.1 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.6.0 + '@ethersproject/networks': registry.npmjs.org/@ethersproject/networks/5.6.3 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + '@ethersproject/web': registry.npmjs.org/@ethersproject/web/5.6.1 - registry.npmmirror.com/@ensdomains/resolver/0.2.4: - resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ensdomains/resolver/-/resolver-0.2.4.tgz} - name: '@ensdomains/resolver' + registry.npmjs.org/@ethersproject/abstract-provider/5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz} + name: '@ethersproject/abstract-provider' + version: 5.7.0 + dependencies: + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/networks': registry.npmjs.org/@ethersproject/networks/5.7.1 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + '@ethersproject/web': registry.npmjs.org/@ethersproject/web/5.7.1 + + registry.npmjs.org/@ethersproject/abstract-signer/5.6.2: + resolution: {integrity: sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz} + name: '@ethersproject/abstract-signer' + version: 5.6.2 + dependencies: + '@ethersproject/abstract-provider': registry.npmjs.org/@ethersproject/abstract-provider/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + + registry.npmjs.org/@ethersproject/abstract-signer/5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz} + name: '@ethersproject/abstract-signer' + version: 5.7.0 + dependencies: + '@ethersproject/abstract-provider': registry.npmjs.org/@ethersproject/abstract-provider/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + + registry.npmjs.org/@ethersproject/address/5.6.1: + resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz} + name: '@ethersproject/address' + version: 5.6.1 + dependencies: + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/rlp': registry.npmjs.org/@ethersproject/rlp/5.6.1 + + registry.npmjs.org/@ethersproject/address/5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz} + name: '@ethersproject/address' + version: 5.7.0 + dependencies: + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/rlp': registry.npmjs.org/@ethersproject/rlp/5.7.0 + + registry.npmjs.org/@ethersproject/base64/5.6.1: + resolution: {integrity: sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/base64/-/base64-5.6.1.tgz} + name: '@ethersproject/base64' + version: 5.6.1 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + + registry.npmjs.org/@ethersproject/base64/5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz} + name: '@ethersproject/base64' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + + registry.npmjs.org/@ethersproject/basex/5.6.1: + resolution: {integrity: sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/basex/-/basex-5.6.1.tgz} + name: '@ethersproject/basex' + version: 5.6.1 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + + registry.npmjs.org/@ethersproject/basex/5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz} + name: '@ethersproject/basex' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + + registry.npmjs.org/@ethersproject/bignumber/5.6.2: + resolution: {integrity: sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.6.2.tgz} + name: '@ethersproject/bignumber' + version: 5.6.2 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + bn.js: registry.npmjs.org/bn.js/5.2.1 + + registry.npmjs.org/@ethersproject/bignumber/5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz} + name: '@ethersproject/bignumber' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + bn.js: registry.npmjs.org/bn.js/5.2.1 + + registry.npmjs.org/@ethersproject/bytes/5.6.1: + resolution: {integrity: sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz} + name: '@ethersproject/bytes' + version: 5.6.1 + dependencies: + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/bytes/5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz} + name: '@ethersproject/bytes' + version: 5.7.0 + dependencies: + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/constants/5.6.1: + resolution: {integrity: sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/constants/-/constants-5.6.1.tgz} + name: '@ethersproject/constants' + version: 5.6.1 + dependencies: + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + + registry.npmjs.org/@ethersproject/constants/5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz} + name: '@ethersproject/constants' + version: 5.7.0 + dependencies: + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + + registry.npmjs.org/@ethersproject/contracts/5.6.2: + resolution: {integrity: sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.6.2.tgz} + name: '@ethersproject/contracts' + version: 5.6.2 + dependencies: + '@ethersproject/abi': registry.npmjs.org/@ethersproject/abi/5.7.0 + '@ethersproject/abstract-provider': registry.npmjs.org/@ethersproject/abstract-provider/5.7.0 + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + + registry.npmjs.org/@ethersproject/contracts/5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz} + name: '@ethersproject/contracts' + version: 5.7.0 + dependencies: + '@ethersproject/abi': registry.npmjs.org/@ethersproject/abi/5.7.0 + '@ethersproject/abstract-provider': registry.npmjs.org/@ethersproject/abstract-provider/5.7.0 + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + dev: false + + registry.npmjs.org/@ethersproject/hash/5.6.1: + resolution: {integrity: sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/hash/-/hash-5.6.1.tgz} + name: '@ethersproject/hash' + version: 5.6.1 + dependencies: + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + + registry.npmjs.org/@ethersproject/hash/5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz} + name: '@ethersproject/hash' + version: 5.7.0 + dependencies: + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/base64': registry.npmjs.org/@ethersproject/base64/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + + registry.npmjs.org/@ethersproject/hdnode/5.6.2: + resolution: {integrity: sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.6.2.tgz} + name: '@ethersproject/hdnode' + version: 5.6.2 + dependencies: + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/basex': registry.npmjs.org/@ethersproject/basex/5.6.1 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/pbkdf2': registry.npmjs.org/@ethersproject/pbkdf2/5.6.1 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/sha2': registry.npmjs.org/@ethersproject/sha2/5.7.0 + '@ethersproject/signing-key': registry.npmjs.org/@ethersproject/signing-key/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + '@ethersproject/wordlists': registry.npmjs.org/@ethersproject/wordlists/5.7.0 + + registry.npmjs.org/@ethersproject/hdnode/5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz} + name: '@ethersproject/hdnode' + version: 5.7.0 + dependencies: + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/basex': registry.npmjs.org/@ethersproject/basex/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/pbkdf2': registry.npmjs.org/@ethersproject/pbkdf2/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/sha2': registry.npmjs.org/@ethersproject/sha2/5.7.0 + '@ethersproject/signing-key': registry.npmjs.org/@ethersproject/signing-key/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + '@ethersproject/wordlists': registry.npmjs.org/@ethersproject/wordlists/5.7.0 + + registry.npmjs.org/@ethersproject/json-wallets/5.6.1: + resolution: {integrity: sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz} + name: '@ethersproject/json-wallets' + version: 5.6.1 + dependencies: + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/hdnode': registry.npmjs.org/@ethersproject/hdnode/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/pbkdf2': registry.npmjs.org/@ethersproject/pbkdf2/5.6.1 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/random': registry.npmjs.org/@ethersproject/random/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + aes-js: registry.npmjs.org/aes-js/3.0.0 + scrypt-js: registry.npmjs.org/scrypt-js/3.0.1 + + registry.npmjs.org/@ethersproject/json-wallets/5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz} + name: '@ethersproject/json-wallets' + version: 5.7.0 + dependencies: + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/hdnode': registry.npmjs.org/@ethersproject/hdnode/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/pbkdf2': registry.npmjs.org/@ethersproject/pbkdf2/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/random': registry.npmjs.org/@ethersproject/random/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + aes-js: registry.npmjs.org/aes-js/3.0.0 + scrypt-js: registry.npmjs.org/scrypt-js/3.0.1 + + registry.npmjs.org/@ethersproject/keccak256/5.6.1: + resolution: {integrity: sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.6.1.tgz} + name: '@ethersproject/keccak256' + version: 5.6.1 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + js-sha3: registry.npmjs.org/js-sha3/0.8.0 + + registry.npmjs.org/@ethersproject/keccak256/5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz} + name: '@ethersproject/keccak256' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + js-sha3: registry.npmjs.org/js-sha3/0.8.0 + + registry.npmjs.org/@ethersproject/logger/5.6.0: + resolution: {integrity: sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/logger/-/logger-5.6.0.tgz} + name: '@ethersproject/logger' + version: 5.6.0 + + registry.npmjs.org/@ethersproject/logger/5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz} + name: '@ethersproject/logger' + version: 5.7.0 + + registry.npmjs.org/@ethersproject/networks/5.6.3: + resolution: {integrity: sha512-QZxRH7cA5Ut9TbXwZFiCyuPchdWi87ZtVNHWZd0R6YFgYtes2jQ3+bsslJ0WdyDe0i6QumqtoYqvY3rrQFRZOQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/networks/-/networks-5.6.3.tgz} + name: '@ethersproject/networks' + version: 5.6.3 + dependencies: + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/networks/5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz} + name: '@ethersproject/networks' + version: 5.7.1 + dependencies: + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/pbkdf2/5.6.1: + resolution: {integrity: sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz} + name: '@ethersproject/pbkdf2' + version: 5.6.1 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/sha2': registry.npmjs.org/@ethersproject/sha2/5.7.0 + + registry.npmjs.org/@ethersproject/pbkdf2/5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz} + name: '@ethersproject/pbkdf2' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/sha2': registry.npmjs.org/@ethersproject/sha2/5.7.0 + + registry.npmjs.org/@ethersproject/properties/5.6.0: + resolution: {integrity: sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/properties/-/properties-5.6.0.tgz} + name: '@ethersproject/properties' + version: 5.6.0 + dependencies: + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/properties/5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz} + name: '@ethersproject/properties' + version: 5.7.0 + dependencies: + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/providers/5.6.8: + resolution: {integrity: sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/providers/-/providers-5.6.8.tgz} + name: '@ethersproject/providers' + version: 5.6.8 + dependencies: + '@ethersproject/abstract-provider': registry.npmjs.org/@ethersproject/abstract-provider/5.7.0 + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/base64': registry.npmjs.org/@ethersproject/base64/5.6.1 + '@ethersproject/basex': registry.npmjs.org/@ethersproject/basex/5.6.1 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.7.0 + '@ethersproject/hash': registry.npmjs.org/@ethersproject/hash/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/networks': registry.npmjs.org/@ethersproject/networks/5.6.3 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/random': registry.npmjs.org/@ethersproject/random/5.7.0 + '@ethersproject/rlp': registry.npmjs.org/@ethersproject/rlp/5.6.1 + '@ethersproject/sha2': registry.npmjs.org/@ethersproject/sha2/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + '@ethersproject/web': registry.npmjs.org/@ethersproject/web/5.6.1 + bech32: registry.npmjs.org/bech32/1.1.4 + ws: registry.npmjs.org/ws/7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + registry.npmjs.org/@ethersproject/random/5.6.1: + resolution: {integrity: sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/random/-/random-5.6.1.tgz} + name: '@ethersproject/random' + version: 5.6.1 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/random/5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz} + name: '@ethersproject/random' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/rlp/5.6.1: + resolution: {integrity: sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.6.1.tgz} + name: '@ethersproject/rlp' + version: 5.6.1 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/rlp/5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz} + name: '@ethersproject/rlp' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/sha2/5.6.1: + resolution: {integrity: sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.6.1.tgz} + name: '@ethersproject/sha2' + version: 5.6.1 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + hash.js: registry.npmjs.org/hash.js/1.1.7 + + registry.npmjs.org/@ethersproject/sha2/5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz} + name: '@ethersproject/sha2' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + hash.js: registry.npmjs.org/hash.js/1.1.7 + + registry.npmjs.org/@ethersproject/signing-key/5.6.2: + resolution: {integrity: sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.6.2.tgz} + name: '@ethersproject/signing-key' + version: 5.6.2 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + bn.js: registry.npmjs.org/bn.js/5.2.1 + elliptic: registry.npmjs.org/elliptic/6.5.4 + hash.js: registry.npmjs.org/hash.js/1.1.7 + + registry.npmjs.org/@ethersproject/signing-key/5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz} + name: '@ethersproject/signing-key' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + bn.js: registry.npmjs.org/bn.js/5.2.1 + elliptic: registry.npmjs.org/elliptic/6.5.4 + hash.js: registry.npmjs.org/hash.js/1.1.7 + + registry.npmjs.org/@ethersproject/solidity/5.6.1: + resolution: {integrity: sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.6.1.tgz} + name: '@ethersproject/solidity' + version: 5.6.1 + dependencies: + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/sha2': registry.npmjs.org/@ethersproject/sha2/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + + registry.npmjs.org/@ethersproject/solidity/5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz} + name: '@ethersproject/solidity' + version: 5.7.0 + dependencies: + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/sha2': registry.npmjs.org/@ethersproject/sha2/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + dev: false + + registry.npmjs.org/@ethersproject/strings/5.6.1: + resolution: {integrity: sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/strings/-/strings-5.6.1.tgz} + name: '@ethersproject/strings' + version: 5.6.1 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/strings/5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz} + name: '@ethersproject/strings' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/transactions/5.6.2: + resolution: {integrity: sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.6.2.tgz} + name: '@ethersproject/transactions' + version: 5.6.2 + dependencies: + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/rlp': registry.npmjs.org/@ethersproject/rlp/5.6.1 + '@ethersproject/signing-key': registry.npmjs.org/@ethersproject/signing-key/5.7.0 + + registry.npmjs.org/@ethersproject/transactions/5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz} + name: '@ethersproject/transactions' + version: 5.7.0 + dependencies: + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/rlp': registry.npmjs.org/@ethersproject/rlp/5.7.0 + '@ethersproject/signing-key': registry.npmjs.org/@ethersproject/signing-key/5.7.0 + + registry.npmjs.org/@ethersproject/units/5.6.1: + resolution: {integrity: sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/units/-/units-5.6.1.tgz} + name: '@ethersproject/units' + version: 5.6.1 + dependencies: + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + + registry.npmjs.org/@ethersproject/wallet/5.6.2: + resolution: {integrity: sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.6.2.tgz} + name: '@ethersproject/wallet' + version: 5.6.2 + dependencies: + '@ethersproject/abstract-provider': registry.npmjs.org/@ethersproject/abstract-provider/5.7.0 + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/hash': registry.npmjs.org/@ethersproject/hash/5.7.0 + '@ethersproject/hdnode': registry.npmjs.org/@ethersproject/hdnode/5.7.0 + '@ethersproject/json-wallets': registry.npmjs.org/@ethersproject/json-wallets/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/random': registry.npmjs.org/@ethersproject/random/5.7.0 + '@ethersproject/signing-key': registry.npmjs.org/@ethersproject/signing-key/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + '@ethersproject/wordlists': registry.npmjs.org/@ethersproject/wordlists/5.7.0 + + registry.npmjs.org/@ethersproject/wallet/5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz} + name: '@ethersproject/wallet' + version: 5.7.0 + dependencies: + '@ethersproject/abstract-provider': registry.npmjs.org/@ethersproject/abstract-provider/5.7.0 + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/hash': registry.npmjs.org/@ethersproject/hash/5.7.0 + '@ethersproject/hdnode': registry.npmjs.org/@ethersproject/hdnode/5.7.0 + '@ethersproject/json-wallets': registry.npmjs.org/@ethersproject/json-wallets/5.7.0 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/random': registry.npmjs.org/@ethersproject/random/5.7.0 + '@ethersproject/signing-key': registry.npmjs.org/@ethersproject/signing-key/5.7.0 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.7.0 + '@ethersproject/wordlists': registry.npmjs.org/@ethersproject/wordlists/5.7.0 + dev: false + + registry.npmjs.org/@ethersproject/web/5.6.1: + resolution: {integrity: sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/web/-/web-5.6.1.tgz} + name: '@ethersproject/web' + version: 5.6.1 + dependencies: + '@ethersproject/base64': registry.npmjs.org/@ethersproject/base64/5.6.1 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + + registry.npmjs.org/@ethersproject/web/5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz} + name: '@ethersproject/web' + version: 5.7.1 + dependencies: + '@ethersproject/base64': registry.npmjs.org/@ethersproject/base64/5.7.0 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + + registry.npmjs.org/@ethersproject/wordlists/5.6.1: + resolution: {integrity: sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.6.1.tgz} + name: '@ethersproject/wordlists' + version: 5.6.1 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/hash': registry.npmjs.org/@ethersproject/hash/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + + registry.npmjs.org/@ethersproject/wordlists/5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz} + name: '@ethersproject/wordlists' + version: 5.7.0 + dependencies: + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.7.0 + '@ethersproject/hash': registry.npmjs.org/@ethersproject/hash/5.7.0 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.7.0 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.7.0 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.7.0 + + registry.npmjs.org/@metamask/eth-sig-util/4.0.1: + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz} + name: '@metamask/eth-sig-util' + version: 4.0.1 + engines: {node: '>=12.0.0'} + dependencies: + ethereumjs-abi: registry.npmjs.org/ethereumjs-abi/0.6.8 + ethereumjs-util: registry.npmjs.org/ethereumjs-util/6.2.1 + ethjs-util: registry.npmjs.org/ethjs-util/0.1.6 + tweetnacl: registry.npmjs.org/tweetnacl/1.0.3 + tweetnacl-util: registry.npmjs.org/tweetnacl-util/0.15.1 + dev: true + + registry.npmjs.org/@noble/hashes/1.0.0: + resolution: {integrity: sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@noble/hashes/-/hashes-1.0.0.tgz} + name: '@noble/hashes' + version: 1.0.0 + dev: true + + registry.npmjs.org/@noble/secp256k1/1.5.5: + resolution: {integrity: sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.5.5.tgz} + name: '@noble/secp256k1' + version: 1.5.5 + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-block/4.0.0: + resolution: {integrity: sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz} + name: '@nomicfoundation/ethereumjs-block' + version: 4.0.0 + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-common': registry.npmjs.org/@nomicfoundation/ethereumjs-common/3.0.0 + '@nomicfoundation/ethereumjs-rlp': registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0 + '@nomicfoundation/ethereumjs-trie': registry.npmjs.org/@nomicfoundation/ethereumjs-trie/5.0.0 + '@nomicfoundation/ethereumjs-tx': registry.npmjs.org/@nomicfoundation/ethereumjs-tx/4.0.0 + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/6.0.0: + resolution: {integrity: sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz} + name: '@nomicfoundation/ethereumjs-blockchain' + version: 6.0.0 + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': registry.npmjs.org/@nomicfoundation/ethereumjs-block/4.0.0 + '@nomicfoundation/ethereumjs-common': registry.npmjs.org/@nomicfoundation/ethereumjs-common/3.0.0 + '@nomicfoundation/ethereumjs-ethash': registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/2.0.0 + '@nomicfoundation/ethereumjs-rlp': registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0 + '@nomicfoundation/ethereumjs-trie': registry.npmjs.org/@nomicfoundation/ethereumjs-trie/5.0.0 + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + abstract-level: registry.npmjs.org/abstract-level/1.0.3 + debug: registry.npmjs.org/debug/4.3.4 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + level: registry.npmjs.org/level/8.0.0 + lru-cache: registry.npmjs.org/lru-cache/5.1.1 + memory-level: registry.npmjs.org/memory-level/1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-common/3.0.0: + resolution: {integrity: sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz} + name: '@nomicfoundation/ethereumjs-common' + version: 3.0.0 + dependencies: + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + crc-32: registry.npmjs.org/crc-32/1.2.2 + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/2.0.0: + resolution: {integrity: sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz} + name: '@nomicfoundation/ethereumjs-ethash' + version: 2.0.0 + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': registry.npmjs.org/@nomicfoundation/ethereumjs-block/4.0.0 + '@nomicfoundation/ethereumjs-rlp': registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0 + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + abstract-level: registry.npmjs.org/abstract-level/1.0.3 + bigint-crypto-utils: registry.npmjs.org/bigint-crypto-utils/3.1.6 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-evm/1.0.0: + resolution: {integrity: sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz} + name: '@nomicfoundation/ethereumjs-evm' + version: 1.0.0 + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-common': registry.npmjs.org/@nomicfoundation/ethereumjs-common/3.0.0 + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + '@types/async-eventemitter': registry.npmjs.org/@types/async-eventemitter/0.2.1 + async-eventemitter: registry.npmjs.org/async-eventemitter/0.2.4 + debug: registry.npmjs.org/debug/4.3.4 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + mcl-wasm: registry.npmjs.org/mcl-wasm/0.7.9 + rustbn.js: registry.npmjs.org/rustbn.js/0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0: + resolution: {integrity: sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz} + name: '@nomicfoundation/ethereumjs-rlp' + version: 4.0.0 + engines: {node: '>=14'} + hasBin: true + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/1.0.0: + resolution: {integrity: sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz} + name: '@nomicfoundation/ethereumjs-statemanager' + version: 1.0.0 + dependencies: + '@nomicfoundation/ethereumjs-common': registry.npmjs.org/@nomicfoundation/ethereumjs-common/3.0.0 + '@nomicfoundation/ethereumjs-rlp': registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0 + '@nomicfoundation/ethereumjs-trie': registry.npmjs.org/@nomicfoundation/ethereumjs-trie/5.0.0 + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + debug: registry.npmjs.org/debug/4.3.4 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + functional-red-black-tree: registry.npmjs.org/functional-red-black-tree/1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-trie/5.0.0: + resolution: {integrity: sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz} + name: '@nomicfoundation/ethereumjs-trie' + version: 5.0.0 + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-rlp': registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0 + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + readable-stream: registry.npmjs.org/readable-stream/3.6.0 + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-tx/4.0.0: + resolution: {integrity: sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz} + name: '@nomicfoundation/ethereumjs-tx' + version: 4.0.0 + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-common': registry.npmjs.org/@nomicfoundation/ethereumjs-common/3.0.0 + '@nomicfoundation/ethereumjs-rlp': registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0 + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0: + resolution: {integrity: sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz} + name: '@nomicfoundation/ethereumjs-util' + version: 8.0.0 + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-rlp': registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + dev: true + + registry.npmjs.org/@nomicfoundation/ethereumjs-vm/6.0.0: + resolution: {integrity: sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz} + name: '@nomicfoundation/ethereumjs-vm' + version: 6.0.0 + engines: {node: '>=14'} + dependencies: + '@nomicfoundation/ethereumjs-block': registry.npmjs.org/@nomicfoundation/ethereumjs-block/4.0.0 + '@nomicfoundation/ethereumjs-blockchain': registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/6.0.0 + '@nomicfoundation/ethereumjs-common': registry.npmjs.org/@nomicfoundation/ethereumjs-common/3.0.0 + '@nomicfoundation/ethereumjs-evm': registry.npmjs.org/@nomicfoundation/ethereumjs-evm/1.0.0 + '@nomicfoundation/ethereumjs-rlp': registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0 + '@nomicfoundation/ethereumjs-statemanager': registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/1.0.0 + '@nomicfoundation/ethereumjs-trie': registry.npmjs.org/@nomicfoundation/ethereumjs-trie/5.0.0 + '@nomicfoundation/ethereumjs-tx': registry.npmjs.org/@nomicfoundation/ethereumjs-tx/4.0.0 + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + '@types/async-eventemitter': registry.npmjs.org/@types/async-eventemitter/0.2.1 + async-eventemitter: registry.npmjs.org/async-eventemitter/0.2.4 + debug: registry.npmjs.org/debug/4.3.4 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + functional-red-black-tree: registry.npmjs.org/functional-red-black-tree/1.0.1 + mcl-wasm: registry.npmjs.org/mcl-wasm/0.7.9 + rustbn.js: registry.npmjs.org/rustbn.js/0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/0.0.3: + resolution: {integrity: sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-darwin-arm64' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/0.0.3: + resolution: {integrity: sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-darwin-x64' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/0.0.3: + resolution: {integrity: sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-freebsd-x64' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/0.0.3: + resolution: {integrity: sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-linux-arm64-gnu' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/0.0.3: + resolution: {integrity: sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-linux-arm64-musl' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/0.0.3: + resolution: {integrity: sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-linux-x64-gnu' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/0.0.3: + resolution: {integrity: sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-linux-x64-musl' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/0.0.3: + resolution: {integrity: sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-win32-arm64-msvc' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/0.0.3: + resolution: {integrity: sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-win32-ia32-msvc' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/0.0.3: + resolution: {integrity: sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer-win32-x64-msvc' + version: 0.0.3 + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + registry.npmjs.org/@nomicfoundation/solidity-analyzer/0.0.3: + resolution: {integrity: sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz} + name: '@nomicfoundation/solidity-analyzer' + version: 0.0.3 + engines: {node: '>= 12'} + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/0.0.3 + '@nomicfoundation/solidity-analyzer-darwin-x64': registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/0.0.3 + '@nomicfoundation/solidity-analyzer-freebsd-x64': registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/0.0.3 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/0.0.3 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/0.0.3 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/0.0.3 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/0.0.3 + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/0.0.3 + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/0.0.3 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/0.0.3 + dev: true + + registry.npmjs.org/@nomiclabs/hardhat-ethers/2.0.6_s5khapt3hiekiyqewlrxpawunq: + resolution: {integrity: sha512-q2Cjp20IB48rEn2NPjR1qxsIQBvFVYW9rFRCFq+bC4RUrn1Ljz3g4wM8uSlgIBZYBi2JMXxmOzFqHraczxq4Ng==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.6.tgz} + id: registry.npmjs.org/@nomiclabs/hardhat-ethers/2.0.6 + name: '@nomiclabs/hardhat-ethers' + version: 2.0.6 + peerDependencies: + ethers: ^5.0.0 + hardhat: ^2.0.0 + dependencies: + ethers: registry.npmjs.org/ethers/5.6.8 + hardhat: registry.npmjs.org/hardhat/2.11.1 + dev: true + + registry.npmjs.org/@nomiclabs/hardhat-etherscan/3.1.0_hardhat@2.11.1: + resolution: {integrity: sha512-JroYgfN1AlYFkQTQ3nRwFi4o8NtZF7K/qFR2dxDUgHbCtIagkUseca9L4E/D2ScUm4XT40+8PbCdqZi+XmHyQA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.0.tgz} + id: registry.npmjs.org/@nomiclabs/hardhat-etherscan/3.1.0 + name: '@nomiclabs/hardhat-etherscan' + version: 3.1.0 + peerDependencies: + hardhat: ^2.0.4 + dependencies: + '@ethersproject/abi': registry.npmjs.org/@ethersproject/abi/5.7.0 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.7.0 + cbor: registry.npmjs.org/cbor/5.2.0 + chalk: registry.npmjs.org/chalk/2.4.2 + debug: registry.npmjs.org/debug/4.3.4 + fs-extra: registry.npmjs.org/fs-extra/7.0.1 + hardhat: registry.npmjs.org/hardhat/2.11.1 + lodash: registry.npmjs.org/lodash/4.17.21 + semver: registry.npmjs.org/semver/6.3.0 + table: registry.npmjs.org/table/6.8.0 + undici: registry.npmjs.org/undici/5.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/@scure/base/1.0.0: + resolution: {integrity: sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@scure/base/-/base-1.0.0.tgz} + name: '@scure/base' + version: 1.0.0 + dev: true + + registry.npmjs.org/@scure/bip32/1.0.1: + resolution: {integrity: sha512-AU88KKTpQ+YpTLoicZ/qhFhRRIo96/tlb+8YmDDHR9yiKVjSsFZiefJO4wjS2PMTkz5/oIcw84uAq/8pleQURA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@scure/bip32/-/bip32-1.0.1.tgz} + name: '@scure/bip32' + version: 1.0.1 + dependencies: + '@noble/hashes': registry.npmjs.org/@noble/hashes/1.0.0 + '@noble/secp256k1': registry.npmjs.org/@noble/secp256k1/1.5.5 + '@scure/base': registry.npmjs.org/@scure/base/1.0.0 + dev: true + + registry.npmjs.org/@scure/bip39/1.0.0: + resolution: {integrity: sha512-HrtcikLbd58PWOkl02k9V6nXWQyoa7A0+Ek9VF7z17DDk9XZAFUcIdqfh0jJXLypmizc5/8P6OxoUeKliiWv4w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@scure/bip39/-/bip39-1.0.0.tgz} + name: '@scure/bip39' + version: 1.0.0 + dependencies: + '@noble/hashes': registry.npmjs.org/@noble/hashes/1.0.0 + '@scure/base': registry.npmjs.org/@scure/base/1.0.0 + dev: true + + registry.npmjs.org/@sentry/core/5.30.0: + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz} + name: '@sentry/core' + version: 5.30.0 + engines: {node: '>=6'} + dependencies: + '@sentry/hub': registry.npmjs.org/@sentry/hub/5.30.0 + '@sentry/minimal': registry.npmjs.org/@sentry/minimal/5.30.0 + '@sentry/types': registry.npmjs.org/@sentry/types/5.30.0 + '@sentry/utils': registry.npmjs.org/@sentry/utils/5.30.0 + tslib: registry.npmjs.org/tslib/1.14.1 + dev: true + + registry.npmjs.org/@sentry/hub/5.30.0: + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz} + name: '@sentry/hub' + version: 5.30.0 + engines: {node: '>=6'} + dependencies: + '@sentry/types': registry.npmjs.org/@sentry/types/5.30.0 + '@sentry/utils': registry.npmjs.org/@sentry/utils/5.30.0 + tslib: registry.npmjs.org/tslib/1.14.1 + dev: true + + registry.npmjs.org/@sentry/minimal/5.30.0: + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz} + name: '@sentry/minimal' + version: 5.30.0 + engines: {node: '>=6'} + dependencies: + '@sentry/hub': registry.npmjs.org/@sentry/hub/5.30.0 + '@sentry/types': registry.npmjs.org/@sentry/types/5.30.0 + tslib: registry.npmjs.org/tslib/1.14.1 + dev: true + + registry.npmjs.org/@sentry/node/5.30.0: + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz} + name: '@sentry/node' + version: 5.30.0 + engines: {node: '>=6'} + dependencies: + '@sentry/core': registry.npmjs.org/@sentry/core/5.30.0 + '@sentry/hub': registry.npmjs.org/@sentry/hub/5.30.0 + '@sentry/tracing': registry.npmjs.org/@sentry/tracing/5.30.0 + '@sentry/types': registry.npmjs.org/@sentry/types/5.30.0 + '@sentry/utils': registry.npmjs.org/@sentry/utils/5.30.0 + cookie: registry.npmjs.org/cookie/0.4.2 + https-proxy-agent: registry.npmjs.org/https-proxy-agent/5.0.1 + lru_map: registry.npmjs.org/lru_map/0.3.3 + tslib: registry.npmjs.org/tslib/1.14.1 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/@sentry/tracing/5.30.0: + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz} + name: '@sentry/tracing' + version: 5.30.0 + engines: {node: '>=6'} + dependencies: + '@sentry/hub': registry.npmjs.org/@sentry/hub/5.30.0 + '@sentry/minimal': registry.npmjs.org/@sentry/minimal/5.30.0 + '@sentry/types': registry.npmjs.org/@sentry/types/5.30.0 + '@sentry/utils': registry.npmjs.org/@sentry/utils/5.30.0 + tslib: registry.npmjs.org/tslib/1.14.1 + dev: true + + registry.npmjs.org/@sentry/types/5.30.0: + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz} + name: '@sentry/types' + version: 5.30.0 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/@sentry/utils/5.30.0: + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz} + name: '@sentry/utils' + version: 5.30.0 + engines: {node: '>=6'} + dependencies: + '@sentry/types': registry.npmjs.org/@sentry/types/5.30.0 + tslib: registry.npmjs.org/tslib/1.14.1 + dev: true + + registry.npmjs.org/@types/async-eventemitter/0.2.1: + resolution: {integrity: sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz} + name: '@types/async-eventemitter' + version: 0.2.1 + dev: true + + registry.npmjs.org/@types/bn.js/4.11.6: + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz} + name: '@types/bn.js' + version: 4.11.6 + dependencies: + '@types/node': registry.npmjs.org/@types/node/17.0.42 + dev: true + + registry.npmjs.org/@types/bn.js/5.1.0: + resolution: {integrity: sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz} + name: '@types/bn.js' + version: 5.1.0 + dependencies: + '@types/node': registry.npmjs.org/@types/node/17.0.42 + dev: true + + registry.npmjs.org/@types/lru-cache/5.1.1: + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz} + name: '@types/lru-cache' + version: 5.1.1 + dev: true + + registry.npmjs.org/@types/node/17.0.42: + resolution: {integrity: sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/node/-/node-17.0.42.tgz} + name: '@types/node' + version: 17.0.42 + dev: true + + registry.npmjs.org/@types/pbkdf2/3.1.0: + resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz} + name: '@types/pbkdf2' + version: 3.1.0 + dependencies: + '@types/node': registry.npmjs.org/@types/node/17.0.42 + dev: true + + registry.npmjs.org/@types/secp256k1/4.0.3: + resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz} + name: '@types/secp256k1' + version: 4.0.3 + dependencies: + '@types/node': registry.npmjs.org/@types/node/17.0.42 + dev: true + + registry.npmjs.org/@ungap/promise-all-settled/1.1.2: + resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz} + name: '@ungap/promise-all-settled' + version: 1.1.2 + dev: true + + registry.npmjs.org/abort-controller/3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz} + name: abort-controller + version: 3.0.0 + engines: {node: '>=6.5'} + dependencies: + event-target-shim: registry.npmjs.org/event-target-shim/5.0.1 + dev: true + + registry.npmjs.org/abstract-level/1.0.3: + resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz} + name: abstract-level + version: 1.0.3 + engines: {node: '>=12'} + dependencies: + buffer: registry.npmjs.org/buffer/6.0.3 + catering: registry.npmjs.org/catering/2.1.1 + is-buffer: registry.npmjs.org/is-buffer/2.0.5 + level-supports: registry.npmjs.org/level-supports/4.0.1 + level-transcoder: registry.npmjs.org/level-transcoder/1.0.1 + module-error: registry.npmjs.org/module-error/1.0.2 + queue-microtask: registry.npmjs.org/queue-microtask/1.2.3 + dev: true + + registry.npmjs.org/adm-zip/0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz} + name: adm-zip + version: 0.4.16 + engines: {node: '>=0.3.0'} + dev: true + + registry.npmjs.org/aes-js/3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz} + name: aes-js + version: 3.0.0 + + registry.npmjs.org/agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz} + name: agent-base + version: 6.0.2 + engines: {node: '>= 6.0.0'} + dependencies: + debug: registry.npmjs.org/debug/4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz} + name: aggregate-error + version: 3.1.0 + engines: {node: '>=8'} + dependencies: + clean-stack: registry.npmjs.org/clean-stack/2.2.0 + indent-string: registry.npmjs.org/indent-string/4.0.0 + dev: true + + registry.npmjs.org/ajv/8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz} + name: ajv + version: 8.11.0 + dependencies: + fast-deep-equal: registry.npmjs.org/fast-deep-equal/3.1.3 + json-schema-traverse: registry.npmjs.org/json-schema-traverse/1.0.0 + require-from-string: registry.npmjs.org/require-from-string/2.0.2 + uri-js: registry.npmjs.org/uri-js/4.4.1 + dev: true + + registry.npmjs.org/ansi-colors/4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz} + name: ansi-colors + version: 4.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/ansi-colors/4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz} + name: ansi-colors + version: 4.1.3 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz} + name: ansi-escapes + version: 4.3.2 + engines: {node: '>=8'} + dependencies: + type-fest: registry.npmjs.org/type-fest/0.21.3 + dev: true + + registry.npmjs.org/ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz} + name: ansi-regex + version: 5.0.1 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz} + name: ansi-styles + version: 3.2.1 + engines: {node: '>=4'} + dependencies: + color-convert: registry.npmjs.org/color-convert/1.9.3 + dev: true + + registry.npmjs.org/ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz} + name: ansi-styles + version: 4.3.0 + engines: {node: '>=8'} + dependencies: + color-convert: registry.npmjs.org/color-convert/2.0.1 + dev: true + + registry.npmjs.org/anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz} + name: anymatch + version: 3.1.2 + engines: {node: '>= 8'} + dependencies: + normalize-path: registry.npmjs.org/normalize-path/3.0.0 + picomatch: registry.npmjs.org/picomatch/2.3.1 + dev: true + + registry.npmjs.org/argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz} + name: argparse + version: 2.0.1 + dev: true + + registry.npmjs.org/astral-regex/2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz} + name: astral-regex + version: 2.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/async-eventemitter/0.2.4: + resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz} + name: async-eventemitter + version: 0.2.4 + dependencies: + async: registry.npmjs.org/async/2.6.4 + dev: true + + registry.npmjs.org/async/2.6.4: + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/async/-/async-2.6.4.tgz} + name: async + version: 2.6.4 + dependencies: + lodash: registry.npmjs.org/lodash/4.17.21 + dev: true + + registry.npmjs.org/asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz} + name: asynckit + version: 0.4.0 + dev: true + + registry.npmjs.org/axios/0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/axios/-/axios-0.27.2.tgz} + name: axios + version: 0.27.2 + dependencies: + follow-redirects: registry.npmjs.org/follow-redirects/1.15.1 + form-data: registry.npmjs.org/form-data/4.0.0 + transitivePeerDependencies: + - debug + dev: true + + registry.npmjs.org/balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz} + name: balanced-match + version: 1.0.2 + dev: true + + registry.npmjs.org/base-x/3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz} + name: base-x + version: 3.0.9 + dependencies: + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz} + name: base64-js + version: 1.5.1 + dev: true + + registry.npmjs.org/bech32/1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz} + name: bech32 + version: 1.1.4 + + registry.npmjs.org/bigint-crypto-utils/3.1.6: + resolution: {integrity: sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz} + name: bigint-crypto-utils + version: 3.1.6 + engines: {node: '>=10.4.0'} + dependencies: + bigint-mod-arith: registry.npmjs.org/bigint-mod-arith/3.1.1 + dev: true + + registry.npmjs.org/bigint-mod-arith/3.1.1: + resolution: {integrity: sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz} + name: bigint-mod-arith + version: 3.1.1 + engines: {node: '>=10.4.0'} + dev: true + + registry.npmjs.org/bignumber.js/9.0.2: + resolution: {integrity: sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz} + name: bignumber.js + version: 9.0.2 + dev: true + + registry.npmjs.org/binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz} + name: binary-extensions + version: 2.2.0 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/blakejs/1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz} + name: blakejs + version: 1.2.1 + dev: true + + registry.npmjs.org/bn.js/4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz} + name: bn.js + version: 4.12.0 + + registry.npmjs.org/bn.js/5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz} + name: bn.js + version: 5.2.1 + + registry.npmjs.org/brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz} + name: brace-expansion + version: 1.1.11 + dependencies: + balanced-match: registry.npmjs.org/balanced-match/1.0.2 + concat-map: registry.npmjs.org/concat-map/0.0.1 + dev: true + + registry.npmjs.org/brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz} + name: brace-expansion + version: 2.0.1 + dependencies: + balanced-match: registry.npmjs.org/balanced-match/1.0.2 + dev: true + + registry.npmjs.org/braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/braces/-/braces-3.0.2.tgz} + name: braces + version: 3.0.2 + engines: {node: '>=8'} + dependencies: + fill-range: registry.npmjs.org/fill-range/7.0.1 + dev: true + + registry.npmjs.org/brorand/1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz} + name: brorand + version: 1.1.0 + + registry.npmjs.org/browser-level/1.0.1: + resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz} + name: browser-level + version: 1.0.1 + dependencies: + abstract-level: registry.npmjs.org/abstract-level/1.0.3 + catering: registry.npmjs.org/catering/2.1.1 + module-error: registry.npmjs.org/module-error/1.0.2 + run-parallel-limit: registry.npmjs.org/run-parallel-limit/1.1.0 + dev: true + + registry.npmjs.org/browser-stdout/1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz} + name: browser-stdout + version: 1.3.1 + dev: true + + registry.npmjs.org/browserify-aes/1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz} + name: browserify-aes + version: 1.2.0 + dependencies: + buffer-xor: registry.npmjs.org/buffer-xor/1.0.3 + cipher-base: registry.npmjs.org/cipher-base/1.0.4 + create-hash: registry.npmjs.org/create-hash/1.2.0 + evp_bytestokey: registry.npmjs.org/evp_bytestokey/1.0.3 + inherits: registry.npmjs.org/inherits/2.0.4 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/bs58/4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz} + name: bs58 + version: 4.0.1 + dependencies: + base-x: registry.npmjs.org/base-x/3.0.9 + dev: true + + registry.npmjs.org/bs58check/2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz} + name: bs58check + version: 2.1.2 + dependencies: + bs58: registry.npmjs.org/bs58/4.0.1 + create-hash: registry.npmjs.org/create-hash/1.2.0 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz} + name: buffer-from + version: 1.1.2 + dev: true + + registry.npmjs.org/buffer-xor/1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz} + name: buffer-xor + version: 1.0.3 + dev: true + + registry.npmjs.org/buffer/6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz} + name: buffer + version: 6.0.3 + dependencies: + base64-js: registry.npmjs.org/base64-js/1.5.1 + ieee754: registry.npmjs.org/ieee754/1.2.1 + dev: true + + registry.npmjs.org/bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz} + name: bytes + version: 3.1.2 + engines: {node: '>= 0.8'} + dev: true + + registry.npmjs.org/call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz} + name: call-bind + version: 1.0.2 + dependencies: + function-bind: registry.npmjs.org/function-bind/1.1.1 + get-intrinsic: registry.npmjs.org/get-intrinsic/1.1.2 + dev: true + + registry.npmjs.org/camelcase/3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz} + name: camelcase + version: 3.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz} + name: camelcase + version: 6.3.0 + engines: {node: '>=10'} + dev: true + + registry.npmjs.org/catering/2.1.1: + resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/catering/-/catering-2.1.1.tgz} + name: catering + version: 2.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/cbor/5.2.0: + resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz} + name: cbor + version: 5.2.0 + engines: {node: '>=6.0.0'} + dependencies: + bignumber.js: registry.npmjs.org/bignumber.js/9.0.2 + nofilter: registry.npmjs.org/nofilter/1.0.4 + dev: true + + registry.npmjs.org/chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz} + name: chalk + version: 2.4.2 + engines: {node: '>=4'} + dependencies: + ansi-styles: registry.npmjs.org/ansi-styles/3.2.1 + escape-string-regexp: registry.npmjs.org/escape-string-regexp/1.0.5 + supports-color: registry.npmjs.org/supports-color/5.5.0 + dev: true + + registry.npmjs.org/chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz} + name: chalk + version: 4.1.2 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmjs.org/ansi-styles/4.3.0 + supports-color: registry.npmjs.org/supports-color/7.2.0 + dev: true + + registry.npmjs.org/chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz} + name: chokidar + version: 3.5.3 + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: registry.npmjs.org/anymatch/3.1.2 + braces: registry.npmjs.org/braces/3.0.2 + glob-parent: registry.npmjs.org/glob-parent/5.1.2 + is-binary-path: registry.npmjs.org/is-binary-path/2.1.0 + is-glob: registry.npmjs.org/is-glob/4.0.3 + normalize-path: registry.npmjs.org/normalize-path/3.0.0 + readdirp: registry.npmjs.org/readdirp/3.6.0 + optionalDependencies: + fsevents: registry.npmjs.org/fsevents/2.3.2 + dev: true + + registry.npmjs.org/ci-info/2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz} + name: ci-info + version: 2.0.0 + dev: true + + registry.npmjs.org/cipher-base/1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz} + name: cipher-base + version: 1.0.4 + dependencies: + inherits: registry.npmjs.org/inherits/2.0.4 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/classic-level/1.2.0: + resolution: {integrity: sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz} + name: classic-level + version: 1.2.0 + engines: {node: '>=12'} + requiresBuild: true + dependencies: + abstract-level: registry.npmjs.org/abstract-level/1.0.3 + catering: registry.npmjs.org/catering/2.1.1 + module-error: registry.npmjs.org/module-error/1.0.2 + napi-macros: registry.npmjs.org/napi-macros/2.0.0 + node-gyp-build: registry.npmjs.org/node-gyp-build/4.4.0 + dev: true + + registry.npmjs.org/clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz} + name: clean-stack + version: 2.2.0 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz} + name: cliui + version: 7.0.4 + dependencies: + string-width: registry.npmjs.org/string-width/4.2.3 + strip-ansi: registry.npmjs.org/strip-ansi/6.0.1 + wrap-ansi: registry.npmjs.org/wrap-ansi/7.0.0 + dev: true + + registry.npmjs.org/color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz} + name: color-convert + version: 1.9.3 + dependencies: + color-name: registry.npmjs.org/color-name/1.1.3 + dev: true + + registry.npmjs.org/color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz} + name: color-convert + version: 2.0.1 + engines: {node: '>=7.0.0'} + dependencies: + color-name: registry.npmjs.org/color-name/1.1.4 + dev: true + + registry.npmjs.org/color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz} + name: color-name + version: 1.1.3 + dev: true + + registry.npmjs.org/color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz} + name: color-name + version: 1.1.4 + dev: true + + registry.npmjs.org/colors/1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/colors/-/colors-1.4.0.tgz} + name: colors + version: 1.4.0 + engines: {node: '>=0.1.90'} + requiresBuild: true + optional: true + + registry.npmjs.org/combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz} + name: combined-stream + version: 1.0.8 + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: registry.npmjs.org/delayed-stream/1.0.0 + dev: true + + registry.npmjs.org/command-exists/1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz} + name: command-exists + version: 1.2.9 + dev: true + + registry.npmjs.org/commander/3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/commander/-/commander-3.0.2.tgz} + name: commander + version: 3.0.2 + dev: true + + registry.npmjs.org/concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz} + name: concat-map + version: 0.0.1 + dev: true + + registry.npmjs.org/cookie/0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz} + name: cookie + version: 0.4.2 + engines: {node: '>= 0.6'} + dev: true + + registry.npmjs.org/crc-32/1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz} + name: crc-32 + version: 1.2.2 + engines: {node: '>=0.8'} + hasBin: true + dev: true + + registry.npmjs.org/create-hash/1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz} + name: create-hash + version: 1.2.0 + dependencies: + cipher-base: registry.npmjs.org/cipher-base/1.0.4 + inherits: registry.npmjs.org/inherits/2.0.4 + md5.js: registry.npmjs.org/md5.js/1.3.5 + ripemd160: registry.npmjs.org/ripemd160/2.0.2 + sha.js: registry.npmjs.org/sha.js/2.4.11 + dev: true + + registry.npmjs.org/create-hmac/1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz} + name: create-hmac + version: 1.1.7 + dependencies: + cipher-base: registry.npmjs.org/cipher-base/1.0.4 + create-hash: registry.npmjs.org/create-hash/1.2.0 + inherits: registry.npmjs.org/inherits/2.0.4 + ripemd160: registry.npmjs.org/ripemd160/2.0.2 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + sha.js: registry.npmjs.org/sha.js/2.4.11 + dev: true + + registry.npmjs.org/debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/debug/-/debug-4.3.4.tgz} + name: debug + version: 4.3.4 + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmjs.org/ms/2.1.2 + dev: true + + registry.npmjs.org/debug/4.3.4_supports-color@8.1.1: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/debug/-/debug-4.3.4.tgz} + id: registry.npmjs.org/debug/4.3.4 + name: debug + version: 4.3.4 + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: registry.npmjs.org/ms/2.1.2 + supports-color: registry.npmjs.org/supports-color/8.1.1 + dev: true + + registry.npmjs.org/decamelize/4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz} + name: decamelize + version: 4.0.0 + engines: {node: '>=10'} + dev: true + + registry.npmjs.org/define-properties/1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz} + name: define-properties + version: 1.1.4 + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: registry.npmjs.org/has-property-descriptors/1.0.0 + object-keys: registry.npmjs.org/object-keys/1.1.1 + dev: true + + registry.npmjs.org/delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz} + name: delayed-stream + version: 1.0.0 + engines: {node: '>=0.4.0'} + dev: true + + registry.npmjs.org/depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/depd/-/depd-2.0.0.tgz} + name: depd + version: 2.0.0 + engines: {node: '>= 0.8'} + dev: true + + registry.npmjs.org/diff/5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/diff/-/diff-5.0.0.tgz} + name: diff + version: 5.0.0 + engines: {node: '>=0.3.1'} + dev: true + + registry.npmjs.org/elliptic/6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz} + name: elliptic + version: 6.5.4 + dependencies: + bn.js: registry.npmjs.org/bn.js/4.12.0 + brorand: registry.npmjs.org/brorand/1.1.0 + hash.js: registry.npmjs.org/hash.js/1.1.7 + hmac-drbg: registry.npmjs.org/hmac-drbg/1.0.1 + inherits: registry.npmjs.org/inherits/2.0.4 + minimalistic-assert: registry.npmjs.org/minimalistic-assert/1.0.1 + minimalistic-crypto-utils: registry.npmjs.org/minimalistic-crypto-utils/1.0.1 + + registry.npmjs.org/emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz} + name: emoji-regex + version: 8.0.0 + dev: true + + registry.npmjs.org/enquirer/2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz} + name: enquirer + version: 2.3.6 + engines: {node: '>=8.6'} + dependencies: + ansi-colors: registry.npmjs.org/ansi-colors/4.1.3 + dev: true + + registry.npmjs.org/env-paths/2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz} + name: env-paths + version: 2.2.1 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz} + name: escalade + version: 3.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz} + name: escape-string-regexp + version: 1.0.5 + engines: {node: '>=0.8.0'} + dev: true + + registry.npmjs.org/escape-string-regexp/4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz} + name: escape-string-regexp + version: 4.0.0 + engines: {node: '>=10'} + dev: true + + registry.npmjs.org/ethereum-cryptography/0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz} + name: ethereum-cryptography + version: 0.1.3 + dependencies: + '@types/pbkdf2': registry.npmjs.org/@types/pbkdf2/3.1.0 + '@types/secp256k1': registry.npmjs.org/@types/secp256k1/4.0.3 + blakejs: registry.npmjs.org/blakejs/1.2.1 + browserify-aes: registry.npmjs.org/browserify-aes/1.2.0 + bs58check: registry.npmjs.org/bs58check/2.1.2 + create-hash: registry.npmjs.org/create-hash/1.2.0 + create-hmac: registry.npmjs.org/create-hmac/1.1.7 + hash.js: registry.npmjs.org/hash.js/1.1.7 + keccak: registry.npmjs.org/keccak/3.0.2 + pbkdf2: registry.npmjs.org/pbkdf2/3.1.2 + randombytes: registry.npmjs.org/randombytes/2.1.0 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + scrypt-js: registry.npmjs.org/scrypt-js/3.0.1 + secp256k1: registry.npmjs.org/secp256k1/4.0.3 + setimmediate: registry.npmjs.org/setimmediate/1.0.5 + dev: true + + registry.npmjs.org/ethereum-cryptography/1.0.3: + resolution: {integrity: sha512-NQLTW0x0CosoVb/n79x/TRHtfvS3hgNUPTUSCu0vM+9k6IIhHFFrAOJReneexjZsoZxMjJHnJn4lrE8EbnSyqQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.0.3.tgz} + name: ethereum-cryptography + version: 1.0.3 + dependencies: + '@noble/hashes': registry.npmjs.org/@noble/hashes/1.0.0 + '@noble/secp256k1': registry.npmjs.org/@noble/secp256k1/1.5.5 + '@scure/bip32': registry.npmjs.org/@scure/bip32/1.0.1 + '@scure/bip39': registry.npmjs.org/@scure/bip39/1.0.0 + dev: true + + registry.npmjs.org/ethereumjs-abi/0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz} + name: ethereumjs-abi + version: 0.6.8 + dependencies: + bn.js: registry.npmjs.org/bn.js/4.12.0 + ethereumjs-util: registry.npmjs.org/ethereumjs-util/6.2.1 + dev: true + + registry.npmjs.org/ethereumjs-util/6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz} + name: ethereumjs-util + version: 6.2.1 + dependencies: + '@types/bn.js': registry.npmjs.org/@types/bn.js/4.11.6 + bn.js: registry.npmjs.org/bn.js/4.12.0 + create-hash: registry.npmjs.org/create-hash/1.2.0 + elliptic: registry.npmjs.org/elliptic/6.5.4 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/0.1.3 + ethjs-util: registry.npmjs.org/ethjs-util/0.1.6 + rlp: registry.npmjs.org/rlp/2.2.7 + dev: true + + registry.npmjs.org/ethereumjs-wallet/0.6.5: + resolution: {integrity: sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz} + name: ethereumjs-wallet + version: 0.6.5 + requiresBuild: true + dependencies: + aes-js: registry.npmmirror.com/aes-js/3.1.2 + bs58check: registry.npmmirror.com/bs58check/2.1.2 + ethereum-cryptography: registry.npmmirror.com/ethereum-cryptography/0.1.3 + ethereumjs-util: registry.npmmirror.com/ethereumjs-util/6.2.1 + randombytes: registry.npmmirror.com/randombytes/2.1.0 + safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 + scryptsy: registry.npmmirror.com/scryptsy/1.2.1 + utf8: registry.npmmirror.com/utf8/3.0.0 + uuid: registry.npmmirror.com/uuid/3.4.0 + dev: true + optional: true + + registry.npmjs.org/ethers/5.6.8: + resolution: {integrity: sha512-YxIGaltAOdvBFPZwIkyHnXbW40f1r8mHUgapW6dxkO+6t7H6wY8POUn0Kbxrd/N7I4hHxyi7YCddMAH/wmho2w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ethers/-/ethers-5.6.8.tgz} + name: ethers + version: 5.6.8 + dependencies: + '@ethersproject/abi': registry.npmjs.org/@ethersproject/abi/5.6.3 + '@ethersproject/abstract-provider': registry.npmjs.org/@ethersproject/abstract-provider/5.6.1 + '@ethersproject/abstract-signer': registry.npmjs.org/@ethersproject/abstract-signer/5.6.2 + '@ethersproject/address': registry.npmjs.org/@ethersproject/address/5.6.1 + '@ethersproject/base64': registry.npmjs.org/@ethersproject/base64/5.6.1 + '@ethersproject/basex': registry.npmjs.org/@ethersproject/basex/5.6.1 + '@ethersproject/bignumber': registry.npmjs.org/@ethersproject/bignumber/5.6.2 + '@ethersproject/bytes': registry.npmjs.org/@ethersproject/bytes/5.6.1 + '@ethersproject/constants': registry.npmjs.org/@ethersproject/constants/5.6.1 + '@ethersproject/contracts': registry.npmjs.org/@ethersproject/contracts/5.6.2 + '@ethersproject/hash': registry.npmjs.org/@ethersproject/hash/5.6.1 + '@ethersproject/hdnode': registry.npmjs.org/@ethersproject/hdnode/5.6.2 + '@ethersproject/json-wallets': registry.npmjs.org/@ethersproject/json-wallets/5.6.1 + '@ethersproject/keccak256': registry.npmjs.org/@ethersproject/keccak256/5.6.1 + '@ethersproject/logger': registry.npmjs.org/@ethersproject/logger/5.6.0 + '@ethersproject/networks': registry.npmjs.org/@ethersproject/networks/5.6.3 + '@ethersproject/pbkdf2': registry.npmjs.org/@ethersproject/pbkdf2/5.6.1 + '@ethersproject/properties': registry.npmjs.org/@ethersproject/properties/5.6.0 + '@ethersproject/providers': registry.npmjs.org/@ethersproject/providers/5.6.8 + '@ethersproject/random': registry.npmjs.org/@ethersproject/random/5.6.1 + '@ethersproject/rlp': registry.npmjs.org/@ethersproject/rlp/5.6.1 + '@ethersproject/sha2': registry.npmjs.org/@ethersproject/sha2/5.6.1 + '@ethersproject/signing-key': registry.npmjs.org/@ethersproject/signing-key/5.6.2 + '@ethersproject/solidity': registry.npmjs.org/@ethersproject/solidity/5.6.1 + '@ethersproject/strings': registry.npmjs.org/@ethersproject/strings/5.6.1 + '@ethersproject/transactions': registry.npmjs.org/@ethersproject/transactions/5.6.2 + '@ethersproject/units': registry.npmjs.org/@ethersproject/units/5.6.1 + '@ethersproject/wallet': registry.npmjs.org/@ethersproject/wallet/5.6.2 + '@ethersproject/web': registry.npmjs.org/@ethersproject/web/5.6.1 + '@ethersproject/wordlists': registry.npmjs.org/@ethersproject/wordlists/5.6.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + registry.npmjs.org/ethjs-util/0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz} + name: ethjs-util + version: 0.1.6 + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: registry.npmjs.org/is-hex-prefixed/1.0.0 + strip-hex-prefix: registry.npmjs.org/strip-hex-prefix/1.0.0 + dev: true + + registry.npmjs.org/event-target-shim/5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz} + name: event-target-shim + version: 5.0.1 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/evp_bytestokey/1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz} + name: evp_bytestokey + version: 1.0.3 + dependencies: + md5.js: registry.npmjs.org/md5.js/1.3.5 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/fast-deep-equal/3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz} + name: fast-deep-equal + version: 3.1.3 + dev: true + + registry.npmjs.org/fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz} + name: fill-range + version: 7.0.1 + engines: {node: '>=8'} + dependencies: + to-regex-range: registry.npmjs.org/to-regex-range/5.0.1 + dev: true + + registry.npmjs.org/find-up/2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz} + name: find-up + version: 2.1.0 + engines: {node: '>=4'} + dependencies: + locate-path: registry.npmjs.org/locate-path/2.0.0 + dev: true + + registry.npmjs.org/find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz} + name: find-up + version: 5.0.0 + engines: {node: '>=10'} + dependencies: + locate-path: registry.npmjs.org/locate-path/6.0.0 + path-exists: registry.npmjs.org/path-exists/4.0.0 + dev: true + + registry.npmjs.org/flat/5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/flat/-/flat-5.0.2.tgz} + name: flat + version: 5.0.2 + hasBin: true + dev: true + + registry.npmjs.org/follow-redirects/1.15.1: + resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz} + name: follow-redirects + version: 1.15.1 + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + + registry.npmjs.org/form-data/4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz} + name: form-data + version: 4.0.0 + engines: {node: '>= 6'} + dependencies: + asynckit: registry.npmjs.org/asynckit/0.4.0 + combined-stream: registry.npmjs.org/combined-stream/1.0.8 + mime-types: registry.npmjs.org/mime-types/2.1.35 + dev: true + + registry.npmjs.org/fp-ts/1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz} + name: fp-ts + version: 1.19.3 + dev: true + + registry.npmjs.org/fs-extra/0.30.0: + resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz} + name: fs-extra + version: 0.30.0 + dependencies: + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 + jsonfile: registry.npmjs.org/jsonfile/2.4.0 + klaw: registry.npmjs.org/klaw/1.3.1 + path-is-absolute: registry.npmjs.org/path-is-absolute/1.0.1 + rimraf: registry.npmjs.org/rimraf/2.7.1 + dev: true + + registry.npmjs.org/fs-extra/7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz} + name: fs-extra + version: 7.0.1 + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 + jsonfile: registry.npmjs.org/jsonfile/4.0.0 + universalify: registry.npmjs.org/universalify/0.1.2 + dev: true + + registry.npmjs.org/fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz} + name: fs.realpath + version: 1.0.0 + dev: true + + registry.npmjs.org/fsevents/2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz} + name: fsevents + version: 2.1.3 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + requiresBuild: true + optional: true + + registry.npmjs.org/fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz} + name: fsevents + version: 2.3.2 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + registry.npmjs.org/function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz} + name: function-bind + version: 1.1.1 + dev: true + + registry.npmjs.org/functional-red-black-tree/1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz} + name: functional-red-black-tree + version: 1.0.1 + dev: true + + registry.npmjs.org/get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz} + name: get-caller-file + version: 2.0.5 + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + registry.npmjs.org/get-intrinsic/1.1.2: + resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz} + name: get-intrinsic + version: 1.1.2 + dependencies: + function-bind: registry.npmjs.org/function-bind/1.1.1 + has: registry.npmjs.org/has/1.0.3 + has-symbols: registry.npmjs.org/has-symbols/1.0.3 + dev: true + + registry.npmjs.org/glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz} + name: glob-parent + version: 5.1.2 + engines: {node: '>= 6'} + dependencies: + is-glob: registry.npmjs.org/is-glob/4.0.3 + dev: true + + registry.npmjs.org/glob/7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/glob/-/glob-7.2.0.tgz} + name: glob + version: 7.2.0 + dependencies: + fs.realpath: registry.npmjs.org/fs.realpath/1.0.0 + inflight: registry.npmjs.org/inflight/1.0.6 + inherits: registry.npmjs.org/inherits/2.0.4 + minimatch: registry.npmjs.org/minimatch/3.1.2 + once: registry.npmjs.org/once/1.4.0 + path-is-absolute: registry.npmjs.org/path-is-absolute/1.0.1 + dev: true + + registry.npmjs.org/glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/glob/-/glob-7.2.3.tgz} + name: glob + version: 7.2.3 + dependencies: + fs.realpath: registry.npmjs.org/fs.realpath/1.0.0 + inflight: registry.npmjs.org/inflight/1.0.6 + inherits: registry.npmjs.org/inherits/2.0.4 + minimatch: registry.npmjs.org/minimatch/3.1.2 + once: registry.npmjs.org/once/1.4.0 + path-is-absolute: registry.npmjs.org/path-is-absolute/1.0.1 + dev: true + + registry.npmjs.org/graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz} + name: graceful-fs + version: 4.2.10 + + registry.npmjs.org/hardhat/2.11.1: + resolution: {integrity: sha512-7FoyfKjBs97GHNpQejHecJBBcRPOEhAE3VkjSWXB3GeeiXefWbw+zhRVOjI4eCsUUt7PyNFAdWje/lhnBT9fig==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/hardhat/-/hardhat-2.11.1.tgz} + name: hardhat + version: 2.11.1 + engines: {node: ^14.0.0 || ^16.0.0 || ^18.0.0} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + dependencies: + '@ethersproject/abi': registry.npmjs.org/@ethersproject/abi/5.6.3 + '@metamask/eth-sig-util': registry.npmjs.org/@metamask/eth-sig-util/4.0.1 + '@nomicfoundation/ethereumjs-block': registry.npmjs.org/@nomicfoundation/ethereumjs-block/4.0.0 + '@nomicfoundation/ethereumjs-blockchain': registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/6.0.0 + '@nomicfoundation/ethereumjs-common': registry.npmjs.org/@nomicfoundation/ethereumjs-common/3.0.0 + '@nomicfoundation/ethereumjs-evm': registry.npmjs.org/@nomicfoundation/ethereumjs-evm/1.0.0 + '@nomicfoundation/ethereumjs-rlp': registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/4.0.0 + '@nomicfoundation/ethereumjs-statemanager': registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/1.0.0 + '@nomicfoundation/ethereumjs-trie': registry.npmjs.org/@nomicfoundation/ethereumjs-trie/5.0.0 + '@nomicfoundation/ethereumjs-tx': registry.npmjs.org/@nomicfoundation/ethereumjs-tx/4.0.0 + '@nomicfoundation/ethereumjs-util': registry.npmjs.org/@nomicfoundation/ethereumjs-util/8.0.0 + '@nomicfoundation/ethereumjs-vm': registry.npmjs.org/@nomicfoundation/ethereumjs-vm/6.0.0 + '@nomicfoundation/solidity-analyzer': registry.npmjs.org/@nomicfoundation/solidity-analyzer/0.0.3 + '@sentry/node': registry.npmjs.org/@sentry/node/5.30.0 + '@types/bn.js': registry.npmjs.org/@types/bn.js/5.1.0 + '@types/lru-cache': registry.npmjs.org/@types/lru-cache/5.1.1 + abort-controller: registry.npmjs.org/abort-controller/3.0.0 + adm-zip: registry.npmjs.org/adm-zip/0.4.16 + aggregate-error: registry.npmjs.org/aggregate-error/3.1.0 + ansi-escapes: registry.npmjs.org/ansi-escapes/4.3.2 + chalk: registry.npmjs.org/chalk/2.4.2 + chokidar: registry.npmjs.org/chokidar/3.5.3 + ci-info: registry.npmjs.org/ci-info/2.0.0 + debug: registry.npmjs.org/debug/4.3.4 + enquirer: registry.npmjs.org/enquirer/2.3.6 + env-paths: registry.npmjs.org/env-paths/2.2.1 + ethereum-cryptography: registry.npmjs.org/ethereum-cryptography/1.0.3 + ethereumjs-abi: registry.npmjs.org/ethereumjs-abi/0.6.8 + find-up: registry.npmjs.org/find-up/2.1.0 + fp-ts: registry.npmjs.org/fp-ts/1.19.3 + fs-extra: registry.npmjs.org/fs-extra/7.0.1 + glob: registry.npmjs.org/glob/7.2.0 + immutable: registry.npmjs.org/immutable/4.1.0 + io-ts: registry.npmjs.org/io-ts/1.10.4 + keccak: registry.npmjs.org/keccak/3.0.2 + lodash: registry.npmjs.org/lodash/4.17.21 + mnemonist: registry.npmjs.org/mnemonist/0.38.5 + mocha: registry.npmjs.org/mocha/10.0.0 + p-map: registry.npmjs.org/p-map/4.0.0 + qs: registry.npmjs.org/qs/6.10.5 + raw-body: registry.npmjs.org/raw-body/2.5.1 + resolve: registry.npmjs.org/resolve/1.17.0 + semver: registry.npmjs.org/semver/6.3.0 + solc: registry.npmjs.org/solc/0.7.3_debug@4.3.4 + source-map-support: registry.npmjs.org/source-map-support/0.5.21 + stacktrace-parser: registry.npmjs.org/stacktrace-parser/0.1.10 + tsort: registry.npmjs.org/tsort/0.0.1 + undici: registry.npmjs.org/undici/5.5.1 + uuid: registry.npmjs.org/uuid/8.3.2 + ws: registry.npmjs.org/ws/7.5.8 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + registry.npmjs.org/has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz} + name: has-flag + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmjs.org/has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz} + name: has-flag + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz} + name: has-property-descriptors + version: 1.0.0 + dependencies: + get-intrinsic: registry.npmjs.org/get-intrinsic/1.1.2 + dev: true + + registry.npmjs.org/has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz} + name: has-symbols + version: 1.0.3 + engines: {node: '>= 0.4'} + dev: true + + registry.npmjs.org/has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/has/-/has-1.0.3.tgz} + name: has + version: 1.0.3 + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: registry.npmjs.org/function-bind/1.1.1 + dev: true + + registry.npmjs.org/hash-base/3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz} + name: hash-base + version: 3.1.0 + engines: {node: '>=4'} + dependencies: + inherits: registry.npmjs.org/inherits/2.0.4 + readable-stream: registry.npmjs.org/readable-stream/3.6.0 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/hash.js/1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz} + name: hash.js + version: 1.1.7 + dependencies: + inherits: registry.npmjs.org/inherits/2.0.4 + minimalistic-assert: registry.npmjs.org/minimalistic-assert/1.0.1 + + registry.npmjs.org/he/1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/he/-/he-1.2.0.tgz} + name: he + version: 1.2.0 + hasBin: true + dev: true + + registry.npmjs.org/hmac-drbg/1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz} + name: hmac-drbg + version: 1.0.1 + dependencies: + hash.js: registry.npmjs.org/hash.js/1.1.7 + minimalistic-assert: registry.npmjs.org/minimalistic-assert/1.0.1 + minimalistic-crypto-utils: registry.npmjs.org/minimalistic-crypto-utils/1.0.1 + + registry.npmjs.org/http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz} + name: http-errors + version: 2.0.0 + engines: {node: '>= 0.8'} + dependencies: + depd: registry.npmjs.org/depd/2.0.0 + inherits: registry.npmjs.org/inherits/2.0.4 + setprototypeof: registry.npmjs.org/setprototypeof/1.2.0 + statuses: registry.npmjs.org/statuses/2.0.1 + toidentifier: registry.npmjs.org/toidentifier/1.0.1 + dev: true + + registry.npmjs.org/https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz} + name: https-proxy-agent + version: 5.0.1 + engines: {node: '>= 6'} + dependencies: + agent-base: registry.npmjs.org/agent-base/6.0.2 + debug: registry.npmjs.org/debug/4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz} + name: iconv-lite + version: 0.4.24 + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: registry.npmjs.org/safer-buffer/2.1.2 + dev: true + + registry.npmjs.org/ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz} + name: ieee754 + version: 1.2.1 + dev: true + + registry.npmjs.org/immutable/4.1.0: + resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz} + name: immutable + version: 4.1.0 + dev: true + + registry.npmjs.org/indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz} + name: indent-string + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz} + name: inflight + version: 1.0.6 + dependencies: + once: registry.npmjs.org/once/1.4.0 + wrappy: registry.npmjs.org/wrappy/1.0.2 + dev: true + + registry.npmjs.org/inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz} + name: inherits + version: 2.0.4 + + registry.npmjs.org/io-ts/1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz} + name: io-ts + version: 1.10.4 + dependencies: + fp-ts: registry.npmjs.org/fp-ts/1.19.3 + dev: true + + registry.npmjs.org/is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz} + name: is-binary-path + version: 2.1.0 + engines: {node: '>=8'} + dependencies: + binary-extensions: registry.npmjs.org/binary-extensions/2.2.0 + dev: true + + registry.npmjs.org/is-buffer/2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz} + name: is-buffer + version: 2.0.5 + engines: {node: '>=4'} + dev: true + + registry.npmjs.org/is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz} + name: is-extglob + version: 2.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz} + name: is-fullwidth-code-point + version: 3.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz} + name: is-glob + version: 4.0.3 + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: registry.npmjs.org/is-extglob/2.1.1 + dev: true + + registry.npmjs.org/is-hex-prefixed/1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz} + name: is-hex-prefixed + version: 1.0.0 + engines: {node: '>=6.5.0', npm: '>=3'} + dev: true + + registry.npmjs.org/is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz} + name: is-number + version: 7.0.0 + engines: {node: '>=0.12.0'} + dev: true + + registry.npmjs.org/is-plain-obj/2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz} + name: is-plain-obj + version: 2.1.0 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/is-unicode-supported/0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz} + name: is-unicode-supported + version: 0.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmjs.org/js-sha3/0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz} + name: js-sha3 + version: 0.8.0 + + registry.npmjs.org/js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz} + name: js-yaml + version: 4.1.0 + hasBin: true + dependencies: + argparse: registry.npmjs.org/argparse/2.0.1 + dev: true + + registry.npmjs.org/json-schema-traverse/1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz} + name: json-schema-traverse + version: 1.0.0 + dev: true + + registry.npmjs.org/jsonfile/2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz} + name: jsonfile + version: 2.4.0 + optionalDependencies: + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 + dev: true + + registry.npmjs.org/jsonfile/4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz} + name: jsonfile + version: 4.0.0 + optionalDependencies: + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 + dev: true + + registry.npmjs.org/keccak/3.0.2: + resolution: {integrity: sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz} + name: keccak + version: 3.0.2 + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + node-addon-api: registry.npmjs.org/node-addon-api/2.0.2 + node-gyp-build: registry.npmjs.org/node-gyp-build/4.4.0 + readable-stream: registry.npmjs.org/readable-stream/3.6.0 + dev: true + + registry.npmjs.org/klaw/1.3.1: + resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz} + name: klaw + version: 1.3.1 + optionalDependencies: + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 + dev: true + + registry.npmjs.org/level-supports/4.0.1: + resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz} + name: level-supports + version: 4.0.1 + engines: {node: '>=12'} + dev: true + + registry.npmjs.org/level-transcoder/1.0.1: + resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz} + name: level-transcoder + version: 1.0.1 + engines: {node: '>=12'} + dependencies: + buffer: registry.npmjs.org/buffer/6.0.3 + module-error: registry.npmjs.org/module-error/1.0.2 + dev: true + + registry.npmjs.org/level/8.0.0: + resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/level/-/level-8.0.0.tgz} + name: level + version: 8.0.0 + engines: {node: '>=12'} + dependencies: + browser-level: registry.npmjs.org/browser-level/1.0.1 + classic-level: registry.npmjs.org/classic-level/1.2.0 + dev: true + + registry.npmjs.org/locate-path/2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz} + name: locate-path + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + p-locate: registry.npmjs.org/p-locate/2.0.0 + path-exists: registry.npmjs.org/path-exists/3.0.0 + dev: true + + registry.npmjs.org/locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz} + name: locate-path + version: 6.0.0 + engines: {node: '>=10'} + dependencies: + p-locate: registry.npmjs.org/p-locate/5.0.0 + dev: true + + registry.npmjs.org/lodash.truncate/4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz} + name: lodash.truncate + version: 4.4.2 + dev: true + + registry.npmjs.org/lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz} + name: lodash + version: 4.17.21 + dev: true + + registry.npmjs.org/log-symbols/4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz} + name: log-symbols + version: 4.1.0 + engines: {node: '>=10'} + dependencies: + chalk: registry.npmjs.org/chalk/4.1.2 + is-unicode-supported: registry.npmjs.org/is-unicode-supported/0.1.0 + dev: true + + registry.npmjs.org/lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz} + name: lru-cache + version: 5.1.1 + dependencies: + yallist: registry.npmjs.org/yallist/3.1.1 + dev: true + + registry.npmjs.org/lru_map/0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz} + name: lru_map + version: 0.3.3 + dev: true + + registry.npmjs.org/mcl-wasm/0.7.9: + resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz} + name: mcl-wasm + version: 0.7.9 + engines: {node: '>=8.9.0'} + dev: true + + registry.npmjs.org/md5.js/1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz} + name: md5.js + version: 1.3.5 + dependencies: + hash-base: registry.npmjs.org/hash-base/3.1.0 + inherits: registry.npmjs.org/inherits/2.0.4 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/memory-level/1.0.0: + resolution: {integrity: sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz} + name: memory-level + version: 1.0.0 + engines: {node: '>=12'} + dependencies: + abstract-level: registry.npmjs.org/abstract-level/1.0.3 + functional-red-black-tree: registry.npmjs.org/functional-red-black-tree/1.0.1 + module-error: registry.npmjs.org/module-error/1.0.2 + dev: true + + registry.npmjs.org/memorystream/0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz} + name: memorystream + version: 0.3.1 + engines: {node: '>= 0.10.0'} + dev: true + + registry.npmjs.org/mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz} + name: mime-db + version: 1.52.0 + engines: {node: '>= 0.6'} + dev: true + + registry.npmjs.org/mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz} + name: mime-types + version: 2.1.35 + engines: {node: '>= 0.6'} + dependencies: + mime-db: registry.npmjs.org/mime-db/1.52.0 + dev: true + + registry.npmjs.org/minimalistic-assert/1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz} + name: minimalistic-assert + version: 1.0.1 + + registry.npmjs.org/minimalistic-crypto-utils/1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz} + name: minimalistic-crypto-utils + version: 1.0.1 + + registry.npmjs.org/minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz} + name: minimatch + version: 3.1.2 + dependencies: + brace-expansion: registry.npmjs.org/brace-expansion/1.1.11 + dev: true + + registry.npmjs.org/minimatch/5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz} + name: minimatch + version: 5.0.1 + engines: {node: '>=10'} + dependencies: + brace-expansion: registry.npmjs.org/brace-expansion/2.0.1 + dev: true + + registry.npmjs.org/mnemonist/0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz} + name: mnemonist + version: 0.38.5 + dependencies: + obliterator: registry.npmjs.org/obliterator/2.0.4 + dev: true + + registry.npmjs.org/mocha/10.0.0: + resolution: {integrity: sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz} + name: mocha + version: 10.0.0 + engines: {node: '>= 14.0.0'} + hasBin: true + dependencies: + '@ungap/promise-all-settled': registry.npmjs.org/@ungap/promise-all-settled/1.1.2 + ansi-colors: registry.npmjs.org/ansi-colors/4.1.1 + browser-stdout: registry.npmjs.org/browser-stdout/1.3.1 + chokidar: registry.npmjs.org/chokidar/3.5.3 + debug: registry.npmjs.org/debug/4.3.4_supports-color@8.1.1 + diff: registry.npmjs.org/diff/5.0.0 + escape-string-regexp: registry.npmjs.org/escape-string-regexp/4.0.0 + find-up: registry.npmjs.org/find-up/5.0.0 + glob: registry.npmjs.org/glob/7.2.0 + he: registry.npmjs.org/he/1.2.0 + js-yaml: registry.npmjs.org/js-yaml/4.1.0 + log-symbols: registry.npmjs.org/log-symbols/4.1.0 + minimatch: registry.npmjs.org/minimatch/5.0.1 + ms: registry.npmjs.org/ms/2.1.3 + nanoid: registry.npmjs.org/nanoid/3.3.3 + serialize-javascript: registry.npmjs.org/serialize-javascript/6.0.0 + strip-json-comments: registry.npmjs.org/strip-json-comments/3.1.1 + supports-color: registry.npmjs.org/supports-color/8.1.1 + workerpool: registry.npmjs.org/workerpool/6.2.1 + yargs: registry.npmjs.org/yargs/16.2.0 + yargs-parser: registry.npmjs.org/yargs-parser/5.0.1 + yargs-unparser: registry.npmjs.org/yargs-unparser/2.0.0 + dev: true + + registry.npmjs.org/module-error/1.0.2: + resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz} + name: module-error + version: 1.0.2 + engines: {node: '>=10'} + dev: true + + registry.npmjs.org/ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ms/-/ms-2.1.2.tgz} + name: ms + version: 2.1.2 + dev: true + + registry.npmjs.org/ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ms/-/ms-2.1.3.tgz} + name: ms + version: 2.1.3 + dev: true + + registry.npmjs.org/nanoid/3.3.3: + resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz} + name: nanoid + version: 3.3.3 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + registry.npmjs.org/napi-macros/2.0.0: + resolution: {integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz} + name: napi-macros + version: 2.0.0 + dev: true + + registry.npmjs.org/node-addon-api/2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz} + name: node-addon-api + version: 2.0.2 + dev: true + + registry.npmjs.org/node-gyp-build/4.4.0: + resolution: {integrity: sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz} + name: node-gyp-build + version: 4.4.0 + hasBin: true + dev: true + + registry.npmjs.org/nofilter/1.0.4: + resolution: {integrity: sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz} + name: nofilter + version: 1.0.4 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz} + name: normalize-path + version: 3.0.0 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz} + name: object-inspect + version: 1.12.2 + dev: true + + registry.npmjs.org/object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz} + name: object-keys + version: 1.1.1 + engines: {node: '>= 0.4'} + dev: true + + registry.npmjs.org/object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz} + name: object.assign + version: 4.1.2 + engines: {node: '>= 0.4'} + dependencies: + call-bind: registry.npmjs.org/call-bind/1.0.2 + define-properties: registry.npmjs.org/define-properties/1.1.4 + has-symbols: registry.npmjs.org/has-symbols/1.0.3 + object-keys: registry.npmjs.org/object-keys/1.1.1 + dev: true + + registry.npmjs.org/obliterator/2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz} + name: obliterator + version: 2.0.4 + dev: true + + registry.npmjs.org/once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/once/-/once-1.4.0.tgz} + name: once + version: 1.4.0 + dependencies: + wrappy: registry.npmjs.org/wrappy/1.0.2 + dev: true + + registry.npmjs.org/os-tmpdir/1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz} + name: os-tmpdir + version: 1.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/p-limit/1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz} + name: p-limit + version: 1.3.0 + engines: {node: '>=4'} + dependencies: + p-try: registry.npmjs.org/p-try/1.0.0 + dev: true + + registry.npmjs.org/p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz} + name: p-limit + version: 3.1.0 + engines: {node: '>=10'} + dependencies: + yocto-queue: registry.npmjs.org/yocto-queue/0.1.0 + dev: true + + registry.npmjs.org/p-locate/2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz} + name: p-locate + version: 2.0.0 + engines: {node: '>=4'} + dependencies: + p-limit: registry.npmjs.org/p-limit/1.3.0 + dev: true + + registry.npmjs.org/p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz} + name: p-locate + version: 5.0.0 + engines: {node: '>=10'} + dependencies: + p-limit: registry.npmjs.org/p-limit/3.1.0 + dev: true + + registry.npmjs.org/p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz} + name: p-map + version: 4.0.0 + engines: {node: '>=10'} + dependencies: + aggregate-error: registry.npmjs.org/aggregate-error/3.1.0 + dev: true + + registry.npmjs.org/p-try/1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz} + name: p-try + version: 1.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmjs.org/path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz} + name: path-exists + version: 3.0.0 + engines: {node: '>=4'} + dev: true + + registry.npmjs.org/path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz} + name: path-exists + version: 4.0.0 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz} + name: path-is-absolute + version: 1.0.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz} + name: path-parse + version: 1.0.7 + dev: true + + registry.npmjs.org/pbkdf2/3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz} + name: pbkdf2 + version: 3.1.2 + engines: {node: '>=0.12'} + dependencies: + create-hash: registry.npmjs.org/create-hash/1.2.0 + create-hmac: registry.npmjs.org/create-hmac/1.1.7 + ripemd160: registry.npmjs.org/ripemd160/2.0.2 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + sha.js: registry.npmjs.org/sha.js/2.4.11 + dev: true + + registry.npmjs.org/picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz} + name: picomatch + version: 2.3.1 + engines: {node: '>=8.6'} + dev: true + + registry.npmjs.org/prettier/1.19.1: + resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz} + name: prettier + version: 1.19.1 + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + registry.npmjs.org/prettier/2.7.0: + resolution: {integrity: sha512-nwoX4GMFgxoPC6diHvSwmK/4yU8FFH3V8XWtLQrbj4IBsK2pkYhG4kf/ljF/haaZ/aii+wNJqISrCDPgxGWDVQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/prettier/-/prettier-2.7.0.tgz} + name: prettier + version: 2.7.0 + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + registry.npmjs.org/punycode/2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz} + name: punycode + version: 2.1.1 + engines: {node: '>=6'} + dev: true + + registry.npmjs.org/qs/6.10.5: + resolution: {integrity: sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/qs/-/qs-6.10.5.tgz} + name: qs + version: 6.10.5 + engines: {node: '>=0.6'} + deprecated: when using stringify with arrayFormat comma, `[]` is appended on single-item arrays. Upgrade to v6.11.0 or downgrade to v6.10.4 to fix. + dependencies: + side-channel: registry.npmjs.org/side-channel/1.0.4 + dev: true + + registry.npmjs.org/queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz} + name: queue-microtask + version: 1.2.3 + dev: true + + registry.npmjs.org/randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz} + name: randombytes + version: 2.1.0 + dependencies: + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz} + name: raw-body + version: 2.5.1 + engines: {node: '>= 0.8'} + dependencies: + bytes: registry.npmjs.org/bytes/3.1.2 + http-errors: registry.npmjs.org/http-errors/2.0.0 + iconv-lite: registry.npmjs.org/iconv-lite/0.4.24 + unpipe: registry.npmjs.org/unpipe/1.0.0 + dev: true + + registry.npmjs.org/readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz} + name: readable-stream + version: 3.6.0 + engines: {node: '>= 6'} + dependencies: + inherits: registry.npmjs.org/inherits/2.0.4 + string_decoder: registry.npmjs.org/string_decoder/1.3.0 + util-deprecate: registry.npmjs.org/util-deprecate/1.0.2 + dev: true + + registry.npmjs.org/readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz} + name: readdirp + version: 3.6.0 + engines: {node: '>=8.10.0'} + dependencies: + picomatch: registry.npmjs.org/picomatch/2.3.1 + dev: true + + registry.npmjs.org/require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz} + name: require-directory + version: 2.1.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz} + name: require-from-string + version: 2.0.2 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/resolve/1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz} + name: resolve + version: 1.17.0 + dependencies: + path-parse: registry.npmjs.org/path-parse/1.0.7 + dev: true + + registry.npmjs.org/rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz} + name: rimraf + version: 2.7.1 + hasBin: true + dependencies: + glob: registry.npmjs.org/glob/7.2.3 + dev: true + + registry.npmjs.org/ripemd160/2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz} + name: ripemd160 + version: 2.0.2 + dependencies: + hash-base: registry.npmjs.org/hash-base/3.1.0 + inherits: registry.npmjs.org/inherits/2.0.4 + dev: true + + registry.npmjs.org/rlp/2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz} + name: rlp + version: 2.2.7 + hasBin: true + dependencies: + bn.js: registry.npmjs.org/bn.js/5.2.1 + dev: true + + registry.npmjs.org/run-parallel-limit/1.1.0: + resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz} + name: run-parallel-limit + version: 1.1.0 + dependencies: + queue-microtask: registry.npmjs.org/queue-microtask/1.2.3 + dev: true + + registry.npmjs.org/rustbn.js/0.2.0: + resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz} + name: rustbn.js + version: 0.2.0 + dev: true + + registry.npmjs.org/safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz} + name: safe-buffer + version: 5.2.1 + dev: true + + registry.npmjs.org/safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz} + name: safer-buffer + version: 2.1.2 + dev: true + + registry.npmjs.org/scrypt-js/3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz} + name: scrypt-js + version: 3.0.1 + + registry.npmjs.org/secp256k1/4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz} + name: secp256k1 + version: 4.0.3 + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + elliptic: registry.npmjs.org/elliptic/6.5.4 + node-addon-api: registry.npmjs.org/node-addon-api/2.0.2 + node-gyp-build: registry.npmjs.org/node-gyp-build/4.4.0 + dev: true + + registry.npmjs.org/semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/semver/-/semver-5.7.1.tgz} + name: semver + version: 5.7.1 + hasBin: true + dev: true + + registry.npmjs.org/semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/semver/-/semver-6.3.0.tgz} + name: semver + version: 6.3.0 + hasBin: true + dev: true + + registry.npmjs.org/serialize-javascript/6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz} + name: serialize-javascript + version: 6.0.0 + dependencies: + randombytes: registry.npmjs.org/randombytes/2.1.0 + dev: true + + registry.npmjs.org/setimmediate/1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz} + name: setimmediate + version: 1.0.5 + dev: true + + registry.npmjs.org/setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz} + name: setprototypeof + version: 1.2.0 + dev: true + + registry.npmjs.org/sha.js/2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz} + name: sha.js + version: 2.4.11 + hasBin: true + dependencies: + inherits: registry.npmjs.org/inherits/2.0.4 + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz} + name: side-channel + version: 1.0.4 + dependencies: + call-bind: registry.npmjs.org/call-bind/1.0.2 + get-intrinsic: registry.npmjs.org/get-intrinsic/1.1.2 + object-inspect: registry.npmjs.org/object-inspect/1.12.2 + dev: true + + registry.npmjs.org/slice-ansi/4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz} + name: slice-ansi + version: 4.0.0 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmjs.org/ansi-styles/4.3.0 + astral-regex: registry.npmjs.org/astral-regex/2.0.0 + is-fullwidth-code-point: registry.npmjs.org/is-fullwidth-code-point/3.0.0 + dev: true + + registry.npmjs.org/solc/0.7.3_debug@4.3.4: + resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/solc/-/solc-0.7.3.tgz} + id: registry.npmjs.org/solc/0.7.3 + name: solc + version: 0.7.3 + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + command-exists: registry.npmjs.org/command-exists/1.2.9 + commander: registry.npmjs.org/commander/3.0.2 + follow-redirects: registry.npmjs.org/follow-redirects/1.15.1 + fs-extra: registry.npmjs.org/fs-extra/0.30.0 + js-sha3: registry.npmjs.org/js-sha3/0.8.0 + memorystream: registry.npmjs.org/memorystream/0.3.1 + require-from-string: registry.npmjs.org/require-from-string/2.0.2 + semver: registry.npmjs.org/semver/5.7.1 + tmp: registry.npmjs.org/tmp/0.0.33 + transitivePeerDependencies: + - debug + dev: true + + registry.npmjs.org/source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz} + name: source-map-support + version: 0.5.21 + dependencies: + buffer-from: registry.npmjs.org/buffer-from/1.1.2 + source-map: registry.npmjs.org/source-map/0.6.1 + dev: true + + registry.npmjs.org/source-map/0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz} + name: source-map + version: 0.2.0 + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + amdefine: 1.0.1 + dev: true + optional: true + + registry.npmjs.org/source-map/0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz} + name: source-map + version: 0.5.7 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz} + name: source-map + version: 0.6.1 + engines: {node: '>=0.10.0'} + dev: true + + registry.npmjs.org/stacktrace-parser/0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz} + name: stacktrace-parser + version: 0.1.10 + engines: {node: '>=6'} + dependencies: + type-fest: registry.npmjs.org/type-fest/0.7.1 + dev: true + + registry.npmjs.org/statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz} + name: statuses + version: 2.0.1 + engines: {node: '>= 0.8'} + dev: true + + registry.npmjs.org/string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz} + name: string-width + version: 4.2.3 + engines: {node: '>=8'} + dependencies: + emoji-regex: registry.npmjs.org/emoji-regex/8.0.0 + is-fullwidth-code-point: registry.npmjs.org/is-fullwidth-code-point/3.0.0 + strip-ansi: registry.npmjs.org/strip-ansi/6.0.1 + dev: true + + registry.npmjs.org/string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz} + name: string_decoder + version: 1.3.0 + dependencies: + safe-buffer: registry.npmjs.org/safe-buffer/5.2.1 + dev: true + + registry.npmjs.org/strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz} + name: strip-ansi + version: 6.0.1 + engines: {node: '>=8'} + dependencies: + ansi-regex: registry.npmjs.org/ansi-regex/5.0.1 + dev: true + + registry.npmjs.org/strip-hex-prefix/1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz} + name: strip-hex-prefix + version: 1.0.0 + engines: {node: '>=6.5.0', npm: '>=3'} + dependencies: + is-hex-prefixed: registry.npmjs.org/is-hex-prefixed/1.0.0 + dev: true + + registry.npmjs.org/strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz} + name: strip-json-comments + version: 3.1.1 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz} + name: supports-color + version: 5.5.0 + engines: {node: '>=4'} + dependencies: + has-flag: registry.npmjs.org/has-flag/3.0.0 + dev: true + + registry.npmjs.org/supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz} + name: supports-color + version: 7.2.0 + engines: {node: '>=8'} + dependencies: + has-flag: registry.npmjs.org/has-flag/4.0.0 + dev: true + + registry.npmjs.org/supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz} + name: supports-color + version: 8.1.1 + engines: {node: '>=10'} + dependencies: + has-flag: registry.npmjs.org/has-flag/4.0.0 + dev: true + + registry.npmjs.org/table/6.8.0: + resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/table/-/table-6.8.0.tgz} + name: table + version: 6.8.0 + engines: {node: '>=10.0.0'} + dependencies: + ajv: registry.npmjs.org/ajv/8.11.0 + lodash.truncate: registry.npmjs.org/lodash.truncate/4.4.2 + slice-ansi: registry.npmjs.org/slice-ansi/4.0.0 + string-width: registry.npmjs.org/string-width/4.2.3 + strip-ansi: registry.npmjs.org/strip-ansi/6.0.1 + dev: true + + registry.npmjs.org/tmp/0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz} + name: tmp + version: 0.0.33 + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: registry.npmjs.org/os-tmpdir/1.0.2 + dev: true + + registry.npmjs.org/to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz} + name: to-regex-range + version: 5.0.1 + engines: {node: '>=8.0'} + dependencies: + is-number: registry.npmjs.org/is-number/7.0.0 + dev: true + + registry.npmjs.org/toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz} + name: toidentifier + version: 1.0.1 + engines: {node: '>=0.6'} + dev: true + + registry.npmjs.org/tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz} + name: tslib + version: 1.14.1 + dev: true + + registry.npmjs.org/tsort/0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz} + name: tsort + version: 0.0.1 + dev: true + + registry.npmjs.org/tweetnacl-util/0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz} + name: tweetnacl-util + version: 0.15.1 + dev: true + + registry.npmjs.org/tweetnacl/1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz} + name: tweetnacl + version: 1.0.3 + dev: true + + registry.npmjs.org/type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz} + name: type-fest + version: 0.21.3 + engines: {node: '>=10'} + dev: true + + registry.npmjs.org/type-fest/0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz} + name: type-fest + version: 0.7.1 + engines: {node: '>=8'} + dev: true + + registry.npmjs.org/uglify-js/3.16.0: + resolution: {integrity: sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.0.tgz} + name: uglify-js + version: 3.16.0 + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + registry.npmjs.org/undici/5.5.1: + resolution: {integrity: sha512-MEvryPLf18HvlCbLSzCW0U00IMftKGI5udnjrQbC5D4P0Hodwffhv+iGfWuJwg16Y/TK11ZFK8i+BPVW2z/eAw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/undici/-/undici-5.5.1.tgz} + name: undici + version: 5.5.1 + engines: {node: '>=12.18'} + dev: true + + registry.npmjs.org/universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz} + name: universalify + version: 0.1.2 + engines: {node: '>= 4.0.0'} + dev: true + + registry.npmjs.org/unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz} + name: unpipe + version: 1.0.0 + engines: {node: '>= 0.8'} + dev: true + + registry.npmjs.org/uri-js/4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz} + name: uri-js + version: 4.4.1 + dependencies: + punycode: registry.npmjs.org/punycode/2.1.1 + dev: true + + registry.npmjs.org/util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz} + name: util-deprecate + version: 1.0.2 + dev: true + + registry.npmjs.org/uuid/8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz} + name: uuid + version: 8.3.2 + hasBin: true + dev: true + + registry.npmjs.org/web3/1.2.11: + resolution: {integrity: sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/web3/-/web3-1.2.11.tgz} + name: web3 + version: 1.2.11 + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + web3-bzz: registry.npmmirror.com/web3-bzz/1.2.11 + web3-core: registry.npmmirror.com/web3-core/1.2.11 + web3-eth: registry.npmmirror.com/web3-eth/1.2.11 + web3-eth-personal: registry.npmmirror.com/web3-eth-personal/1.2.11 + web3-net: registry.npmmirror.com/web3-net/1.2.11 + web3-shh: registry.npmmirror.com/web3-shh/1.2.11 + web3-utils: registry.npmmirror.com/web3-utils/1.2.11 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + optional: true + + registry.npmjs.org/workerpool/6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz} + name: workerpool + version: 6.2.1 + dev: true + + registry.npmjs.org/wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz} + name: wrap-ansi + version: 7.0.0 + engines: {node: '>=10'} + dependencies: + ansi-styles: registry.npmjs.org/ansi-styles/4.3.0 + string-width: registry.npmjs.org/string-width/4.2.3 + strip-ansi: registry.npmjs.org/strip-ansi/6.0.1 + dev: true + + registry.npmjs.org/wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz} + name: wrappy + version: 1.0.2 + dev: true + + registry.npmjs.org/ws/7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ws/-/ws-7.4.6.tgz} + name: ws + version: 7.4.6 + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + registry.npmjs.org/ws/7.5.8: + resolution: {integrity: sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/ws/-/ws-7.5.8.tgz} + name: ws + version: 7.5.8 + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + registry.npmjs.org/y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz} + name: y18n + version: 5.0.8 + engines: {node: '>=10'} + dev: true + + registry.npmjs.org/yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz} + name: yallist + version: 3.1.1 + dev: true + + registry.npmjs.org/yargs-parser/5.0.1: + resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz} + name: yargs-parser + version: 5.0.1 + dependencies: + camelcase: registry.npmjs.org/camelcase/3.0.0 + object.assign: registry.npmjs.org/object.assign/4.1.2 + dev: true + + registry.npmjs.org/yargs-unparser/2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz} + name: yargs-unparser + version: 2.0.0 + engines: {node: '>=10'} + dependencies: + camelcase: registry.npmjs.org/camelcase/6.3.0 + decamelize: registry.npmjs.org/decamelize/4.0.0 + flat: registry.npmjs.org/flat/5.0.2 + is-plain-obj: registry.npmjs.org/is-plain-obj/2.1.0 + dev: true + + registry.npmjs.org/yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz} + name: yargs + version: 16.2.0 + engines: {node: '>=10'} + dependencies: + cliui: registry.npmjs.org/cliui/7.0.4 + escalade: registry.npmjs.org/escalade/3.1.1 + get-caller-file: registry.npmjs.org/get-caller-file/2.0.5 + require-directory: registry.npmjs.org/require-directory/2.1.1 + string-width: registry.npmjs.org/string-width/4.2.3 + y18n: registry.npmjs.org/y18n/5.0.8 + yargs-parser: registry.npmjs.org/yargs-parser/5.0.1 + dev: true + + registry.npmjs.org/yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, registry: https://registry.yarnpkg.com/, tarball: https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz} + name: yocto-queue + version: 0.1.0 + engines: {node: '>=10'} + dev: true + + registry.npmmirror.com/@chainlink/contracts/0.4.0: + resolution: {integrity: sha512-yZGeCBd7d+qxfw9r/JxtPzsW2kCc6MorPRZ/tDKnaJI98H99j5P2Fosfehmcwk6wVZlz+0Bp4kS1y480nw3Zow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@chainlink/contracts/-/contracts-0.4.0.tgz} + name: '@chainlink/contracts' + version: 0.4.0 + dev: false + + registry.npmmirror.com/@ensdomains/ens/0.4.5: + resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ensdomains/ens/-/ens-0.4.5.tgz} + name: '@ensdomains/ens' + version: 0.4.5 + deprecated: Please use @ensdomains/ens-contracts + dependencies: + bluebird: registry.npmmirror.com/bluebird/3.7.2 + eth-ens-namehash: registry.npmmirror.com/eth-ens-namehash/2.0.8 + solc: registry.npmmirror.com/solc/0.4.26 + testrpc: registry.npmmirror.com/testrpc/0.0.1 + web3-utils: registry.npmmirror.com/web3-utils/1.7.3 + dev: true + + registry.npmmirror.com/@ensdomains/resolver/0.2.4: + resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ensdomains/resolver/-/resolver-0.2.4.tgz} + name: '@ensdomains/resolver' version: 0.2.4 deprecated: Please use @ensdomains/ens-contracts dev: true @@ -12987,7 +16419,7 @@ packages: dependencies: '@resolver-engine/imports': registry.npmmirror.com/@resolver-engine/imports/0.3.3 '@resolver-engine/imports-fs': registry.npmmirror.com/@resolver-engine/imports-fs/0.3.3 - '@typechain/ethers-v5': registry.npmmirror.com/@typechain/ethers-v5/2.0.0_klwbm762ath5wqyvpnko75g7be + '@typechain/ethers-v5': registry.npmmirror.com/@typechain/ethers-v5/2.0.0_typechain@3.0.0 '@types/mkdirp': registry.npmmirror.com/@types/mkdirp/0.5.2 '@types/node-fetch': registry.npmmirror.com/@types/node-fetch/2.6.1 ethers: registry.npmmirror.com/ethers/5.6.8 @@ -13552,7 +16984,7 @@ packages: dependencies: '@gnosis.pm/safe-core-sdk-types': registry.npmmirror.com/@gnosis.pm/safe-core-sdk-types/1.1.0 '@gnosis.pm/safe-core-sdk-utils': registry.npmmirror.com/@gnosis.pm/safe-core-sdk-utils/1.1.0 - ethers: 5.6.8 + ethers: registry.npmjs.org/ethers/5.6.8 transitivePeerDependencies: - supports-color dev: true @@ -13591,7 +17023,7 @@ packages: ethers: ^5.0.0 hardhat: ^2.0.0 dependencies: - ethers: 5.6.8 + ethers: registry.npmjs.org/ethers/5.6.8 hardhat: registry.npmmirror.com/hardhat/2.9.9_typescript@4.7.3 registry.npmmirror.com/@nomiclabs/hardhat-waffle/2.0.3_gyeqk6tit2n3xwvnyia3edkily: @@ -13609,7 +17041,7 @@ packages: '@types/sinon-chai': registry.npmmirror.com/@types/sinon-chai/3.2.8 '@types/web3': registry.npmmirror.com/@types/web3/1.0.19 ethereum-waffle: registry.npmmirror.com/ethereum-waffle/3.4.4_typescript@4.7.3 - ethers: 5.6.8 + ethers: registry.npmjs.org/ethers/5.6.8 hardhat: registry.npmmirror.com/hardhat/2.9.9_typescript@4.7.3 dev: true @@ -13834,17 +17266,19 @@ packages: dev: true optional: true - registry.npmmirror.com/@typechain/ethers-v5/2.0.0_klwbm762ath5wqyvpnko75g7be: + registry.npmmirror.com/@typechain/ethers-v5/2.0.0_typechain@3.0.0: resolution: {integrity: sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@typechain/ethers-v5/-/ethers-v5-2.0.0.tgz} id: registry.npmmirror.com/@typechain/ethers-v5/2.0.0 name: '@typechain/ethers-v5' version: 2.0.0 peerDependencies: - ethers: ^5.0.0 typechain: ^3.0.0 dependencies: - ethers: registry.npmmirror.com/ethers/5.6.8 + ethers: registry.npmjs.org/ethers/5.6.8 typechain: registry.npmmirror.com/typechain/3.0.0_typescript@4.7.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate dev: true registry.npmmirror.com/@types/abstract-leveldown/7.2.0: @@ -15513,7 +18947,7 @@ packages: normalize-path: registry.npmmirror.com/normalize-path/3.0.0 readdirp: registry.npmmirror.com/readdirp/3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: registry.npmjs.org/fsevents/2.3.2 registry.npmmirror.com/chownr/1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz} @@ -17260,7 +20694,7 @@ packages: name: fs-extra version: 4.0.3 dependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 jsonfile: registry.npmmirror.com/jsonfile/4.0.0 universalify: registry.npmmirror.com/universalify/0.1.2 dev: true @@ -17352,8 +20786,8 @@ packages: web3-provider-engine: registry.npmmirror.com/web3-provider-engine/14.2.1 websocket: registry.npmmirror.com/websocket/1.0.32 optionalDependencies: - ethereumjs-wallet: 0.6.5 - web3: 1.2.11 + ethereumjs-wallet: registry.npmjs.org/ethereumjs-wallet/0.6.5 + web3: registry.npmjs.org/web3/1.2.11 transitivePeerDependencies: - bufferutil - encoding @@ -17642,7 +21076,7 @@ packages: stacktrace-parser: registry.npmmirror.com/stacktrace-parser/0.1.10 true-case-path: registry.npmmirror.com/true-case-path/2.2.1 tsort: registry.npmmirror.com/tsort/0.0.1 - typescript: registry.npmmirror.com/typescript/4.7.3 + typescript: 4.7.3 undici: registry.npmmirror.com/undici/5.5.1 uuid: registry.npmmirror.com/uuid/8.3.2 ws: registry.npmmirror.com/ws/7.5.8 @@ -18538,14 +21972,14 @@ packages: name: jsonfile version: 2.4.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 registry.npmmirror.com/jsonfile/4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz} name: jsonfile version: 4.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 registry.npmmirror.com/jsonify/0.0.0: resolution: {integrity: sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsonify/-/jsonify-0.0.0.tgz} @@ -18630,7 +22064,7 @@ packages: name: klaw version: 1.3.1 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 registry.npmmirror.com/lcid/1.0.0: resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lcid/-/lcid-1.0.0.tgz} @@ -18865,7 +22299,7 @@ packages: version: 1.1.0 engines: {node: '>=0.10.0'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 parse-json: registry.npmmirror.com/parse-json/2.2.0 pify: registry.npmmirror.com/pify/2.3.0 pinkie-promise: registry.npmmirror.com/pinkie-promise/2.0.1 @@ -19930,7 +23364,7 @@ packages: version: 1.1.0 engines: {node: '>=0.10.0'} dependencies: - graceful-fs: 4.2.10 + graceful-fs: registry.npmjs.org/graceful-fs/4.2.10 pify: registry.npmmirror.com/pify/2.3.0 pinkie-promise: registry.npmmirror.com/pinkie-promise/2.0.1 dev: true @@ -21474,7 +24908,7 @@ packages: peerDependencies: typescript: '>=3.7.0' dependencies: - typescript: registry.npmmirror.com/typescript/4.7.3 + typescript: 4.7.3 dev: true registry.npmmirror.com/ts-generator/0.1.1: @@ -21609,6 +25043,7 @@ packages: version: 4.7.3 engines: {node: '>=4.2.0'} hasBin: true + dev: true registry.npmmirror.com/typewise-core/1.2.0: resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typewise-core/-/typewise-core-1.2.0.tgz}