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/.openzeppelin/unknown-30097.json b/packages/bonds/.openzeppelin/unknown-30097.json new file mode 100644 index 0000000..30d0cd1 --- /dev/null +++ b/packages/bonds/.openzeppelin/unknown-30097.json @@ -0,0 +1,214 @@ +{ + "manifestVersion": "3.2", + "admin": { + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "txHash": "0xc4d3d9ad77baaa62f3429744a1438145239fd53de92596935431d6f91a6195ab" + }, + "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": "0xd0dc0b177a74a9907631d9a0e05b3ccdc15e348bb9ec512e8065b0904f89bd9b", + "kind": "transparent" + } + ], + "impls": { + "d6dd9459847f37380ff5e7fceffedeebc724a33cca181dec22a0292a171d0642": { + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "txHash": "0xca8ba640e576e56338d999047475b90a027eae8c57099ed84d8f5e270cc5fa86", + "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:11" + }, + { + "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:24" + }, + { + "label": "kindBondsMapping", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:26" + }, + { + "label": "seriesBondsMapping", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_string_memory_ptr,t_array(t_address)dyn_storage)", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:28" + }, + { + "label": "bondKinds", + "offset": 0, + "slot": "5", + "type": "t_array(t_string_storage)dyn_storage", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:29" + }, + { + "label": "bondSeries", + "offset": 0, + "slot": "6", + "type": "t_array(t_string_storage)dyn_storage", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:30" + }, + { + "label": "isinBondMapping", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_string_memory_ptr,t_address)", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:33" + }, + { + "label": "bondPrices", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_address,t_struct(BondPrice)6000_storage)", + "contract": "BondFactory", + "src": "contracts/BondFactory.sol:36" + } + ], + "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_struct(BondPrice)6000_storage)": { + "label": "mapping(address => struct IBondFactory.BondPrice)", + "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_struct(BondPrice)6000_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" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + } + } +} 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/BondFactory.sol b/packages/bonds/contracts/BondFactory.sol new file mode 100644 index 0000000..0e3ba83 --- /dev/null +++ b/packages/bonds/contracts/BondFactory.sol @@ -0,0 +1,201 @@ +// 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"; +import "@private/shared/libs/Keepable.sol"; + +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 + */ + 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; + + // isin => bond address + mapping(string => address) public isinBondMapping; + + // bond => price + mapping(address => BondPrice) 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); + + 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(); + } + + function initialize(address admin_) public initializer { + _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_, + BondPrice calldata initialPrice_, + uint256 initialGrant_, + string memory series_, + IERC20Upgradeable underlyingToken_, + 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_, isin_); + isinBondMapping[isin_] = bondTokenAddress; + + if (seriesBondsMapping[series_].length == 0) { + bondSeries.push(series_); + } + setPrice(bondTokenAddress, initialPrice_.price, initialPrice_.bid, initialPrice_.ask); + 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, + uint256 bid, + uint256 ask + ) public onlyAdminOrKeeper { + 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 (BondPrice memory) { + BondPrice memory price = bondPrices[bondToken_]; + verifyPrice(price); + return price; + } + + 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(); + break; + } + + 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(); + break; + } + + delete isinBondMapping[bondToken_.isin()]; + + 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 new file mode 100644 index 0000000..07f1a56 --- /dev/null +++ b/packages/bonds/contracts/DiscountBond.sol @@ -0,0 +1,203 @@ +// 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; + string public isin; + + 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); + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + function initialize( + string memory name_, + string memory symbol_, + string memory series_, + address factory_, + IERC20Upgradeable underlyingToken_, + uint256 maturity_, + string memory isin_ + ) 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 = IBondFactory(factory_); + maturity = maturity_; + isin = isin_; + } + + modifier beforeMaturity() { + require(block.timestamp < maturity, "DiscountBond: MUST_BEFORE_MATURITY"); + _; + } + + modifier afterMaturity() { + require(block.timestamp >= maturity, "DiscountBond: MUST_AFTER_MATURITY"); + _; + } + + modifier tradingGuard() { + _; + } + + 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 (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_); + 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().ask; + require(inventoryAmount >= bondAmount, "DiscountBond: INSUFFICIENT_LIQUIDITY"); + } + + function mintByBondAmount(address account_, uint256 bondAmount_) + external + nonReentrant + 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().ask) / factory.priceFactor(); + } + + function sellByBondAmount(uint256 bondAmount_) + public + beforeMaturity + nonReentrant + 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 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().bid) / factory.priceFactor(); + require(underlyingToken.balanceOf(address(this)) >= underlyingAmount, "DiscountBond: INSUFFICIENT_LIQUIDITY"); + } + + function redeem(uint256 bondAmount_) public { + redeemFor(msg.sender, bondAmount_); + } + + 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().price) / factory.priceFactor(); + } + + function redeemFor(address account_, uint256 bondAmount_) public afterMaturity nonReentrant { + 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..94e3b8b --- /dev/null +++ b/packages/bonds/contracts/interfaces/IBond.sol @@ -0,0 +1,31 @@ +// 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_, + 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; + + 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..643a8dd --- /dev/null +++ b/packages/bonds/contracts/interfaces/IBondFactory.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-3.0 +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 (BondPrice memory 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/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_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/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/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/BondFactory.json b/packages/bonds/deployments/bsctest/BondFactory.json new file mode 100644 index 0000000..46e0ec1 --- /dev/null +++ b/packages/bonds/deployments/bsctest/BondFactory.json @@ -0,0 +1,965 @@ +{ + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "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": "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" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "implementationAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "ownerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "receipt": { + "to": null, + "from": "0xe7a2b8c8fed53713f69227e6c3d2384e80cf88a6", + "contractAddress": "0x4245d080839ddad01af007c196b02ba26c842baf", + "transactionIndex": "0x0", + "gasUsed": "0xa3fd4", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800001000000000000000000000000000440000000000000000000000004000000000000000000001000000000000000000000000000000001000000000000000200000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000020000000000080000000000000000000000000000000000000000000000600000000000000000000000000000000008000000000000108000000000000040000000000000000004000000000000020000000000000000000000400000008000000000000000000000000000000000000", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "logs": [ + { + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "topics": [ + "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000c2720bc2c5a99dcca5d623df513423c3c794754b" + ], + "data": "0x", + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "topics": [ + "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "data": "0x", + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x2", + "removed": false + }, + { + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "data": "0x", + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x3", + "removed": false + } + ], + "blockNumber": "0x171b5b7", + "cumulativeGasUsed": "0xa3fd4", + "status": "0x1" + }, + "args": [ + "0xC2720Bc2C5a99DCCA5d623df513423c3C794754B", + "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "0xc4d66de8000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "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": "0x8e1d9be324C17D9a2F27d5a7470281f7FAAD8470", + "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/BondFactory_Implementation.json b/packages/bonds/deployments/bsctest/BondFactory_Implementation.json new file mode 100644 index 0000000..745b1fe --- /dev/null +++ b/packages/bonds/deployments/bsctest/BondFactory_Implementation.json @@ -0,0 +1,956 @@ +{ + "address": "0x8e1d9be324C17D9a2F27d5a7470281f7FAAD8470", + "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" + } + ], + "transactionHash": "0xe340f20875534cb5fa091b7079b7c56b12f22ea447ba7633bba64de052df481f", + "receipt": { + "to": null, + "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "contractAddress": "0x8e1d9be324C17D9a2F27d5a7470281f7FAAD8470", + "transactionIndex": 19, + "gasUsed": "2916806", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x47713078c863b5b0634e6ea411124c1d5d210e2f18877e7b61d8b951e70e119c", + "transactionHash": "0xe340f20875534cb5fa091b7079b7c56b12f22ea447ba7633bba64de052df481f", + "logs": [], + "blockNumber": 25186788, + "cumulativeGasUsed": "5460289", + "status": 1, + "byzantium": true + }, + "args": [], + "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": { + "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 + }, + "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": 3907, + "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": "isinBondMapping", + "offset": 0, + "slot": "6", + "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": { + "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_struct(BondPrice)3883_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct IBondFactory.BondPrice)", + "numberOfBytes": "32", + "value": "t_struct(BondPrice)3883_storage" + }, + "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_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", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/packages/bonds/deployments/bsctest/BondFactory_Proxy.json b/packages/bonds/deployments/bsctest/BondFactory_Proxy.json new file mode 100644 index 0000000..a21f824 --- /dev/null +++ b/packages/bonds/deployments/bsctest/BondFactory_Proxy.json @@ -0,0 +1,247 @@ +{ + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "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": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "receipt": { + "to": null, + "from": "0xe7a2b8c8fed53713f69227e6c3d2384e80cf88a6", + "contractAddress": "0x4245d080839ddad01af007c196b02ba26c842baf", + "transactionIndex": "0x0", + "gasUsed": "0xa3fd4", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800001000000000000000000000000000440000000000000000000000004000000000000000000001000000000000000000000000000000001000000000000000200000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000020000000000080000000000000000000000000000000000000000000000600000000000000000000000000000000008000000000000108000000000000040000000000000000004000000000000020000000000000000000000400000008000000000000000000000000000000000000", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "logs": [ + { + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "topics": [ + "0x5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b7379068296", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000c2720bc2c5a99dcca5d623df513423c3c794754b" + ], + "data": "0x", + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x0", + "removed": false + }, + { + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "topics": [ + "0x101b8081ff3b56bbf45deb824d86a3b0fd38b7e3dd42421105cf8abe9106db0b", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "data": "0x", + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x1", + "removed": false + }, + { + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x2", + "removed": false + }, + { + "address": "0x4245d080839ddad01af007c196b02ba26c842baf", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "data": "0x", + "blockNumber": "0x171b5b7", + "transactionHash": "0xd98d0a652b42665e8435292e7290047d157fa5353ca35fea385787295f4df95c", + "transactionIndex": "0x0", + "blockHash": "0xea3d8c9c3e6c0449b3b286ae960528a0e478d750dd95b1c9a8849150cbc93d43", + "logIndex": "0x3", + "removed": false + } + ], + "blockNumber": "0x171b5b7", + "cumulativeGasUsed": "0xa3fd4", + "status": "0x1" + }, + "args": [ + "0xC2720Bc2C5a99DCCA5d623df513423c3C794754B", + "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "0xc4d66de8000000000000000000000000e7a2b8c8fed53713f69227e6c3d2384e80cf88a6" + ], + "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/DiscountBond.json b/packages/bonds/deployments/bsctest/DiscountBond.json new file mode 100644 index 0000000..4f87b39 --- /dev/null +++ b/packages/bonds/deployments/bsctest/DiscountBond.json @@ -0,0 +1,1112 @@ +{ + "address": "0x1F158aF01DCF712048e843b36fD8320d69656A68", + "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" + } + ], + "transactionHash": "0x69ff46141af1c89c0a1f8b12c8671fb5b4df87877fbb2131e3ba3caf7e7c8470", + "receipt": { + "to": null, + "from": "0xe7a2b8C8feD53713F69227e6c3d2384E80CF88a6", + "contractAddress": "0x1F158aF01DCF712048e843b36fD8320d69656A68", + "transactionIndex": 9, + "gasUsed": "2075624", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x1f5589c2bab12cf4277355b89999f65d150f463060a08456201a5f27571e3ef3", + "transactionHash": "0x69ff46141af1c89c0a1f8b12c8671fb5b4df87877fbb2131e3ba3caf7e7c8470", + "logs": [], + "blockNumber": 25186795, + "cumulativeGasUsed": "2597677", + "status": 1, + "byzantium": true + }, + "args": [], + "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": { + "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 + }, + "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": 3206, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "factory", + "offset": 0, + "slot": "151", + "type": "t_contract(IBondFactory)3897" + }, + { + "astId": 3209, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "underlyingToken", + "offset": 0, + "slot": "152", + "type": "t_contract(IERC20Upgradeable)1000" + }, + { + "astId": 3211, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "maturity", + "offset": 0, + "slot": "153", + "type": "t_uint256" + }, + { + "astId": 3213, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "series", + "offset": 0, + "slot": "154", + "type": "t_string_storage" + }, + { + "astId": 3215, + "contract": "contracts/DiscountBond.sol:DiscountBond", + "label": "inventoryAmount", + "offset": 0, + "slot": "155", + "type": "t_uint256" + }, + { + "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": { + "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)3897": { + "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/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/6a13f6e055440a5408c02b9e5d62636b.json b/packages/bonds/deployments/bsctest/solcInputs/6a13f6e055440a5408c02b9e5d62636b.json new file mode 100644 index 0000000..fc0005b --- /dev/null +++ b/packages/bonds/deployments/bsctest/solcInputs/6a13f6e055440a5408c02b9e5d62636b.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 // 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" + }, + "@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 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 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" + }, + "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 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" + }, + "@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/hardhat.config.ts b/packages/bonds/hardhat.config.ts new file mode 100644 index 0000000..dd5fb80 --- /dev/null +++ b/packages/bonds/hardhat.config.ts @@ -0,0 +1,208 @@ +// 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/', + url: 'https://bsc-testnet.public.blastapi.io', + 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..2be55e7 --- /dev/null +++ b/packages/bonds/package.json @@ -0,0 +1,42 @@ +{ + "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": "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", + "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" + }, + "dependencies": { + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/solidity": "^5.7.0", + "@ethersproject/wallet": "^5.7.0" + } +} 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/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/DiscountBond.test.ts b/packages/bonds/test/DiscountBond.test.ts new file mode 100644 index 0000000..c4b41d5 --- /dev/null +++ b/packages/bonds/test/DiscountBond.test.ts @@ -0,0 +1,381 @@ +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) + +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), + ask: parseUnits('0.99', 8), + lastUpdated: Math.floor(new Date().valueOf() / 1000), +} + +describe('Bonds', function () { + let bondFactory: BondFactory + let usdcToken: MockERC20 + let discountBond: DiscountBond + let bondToken: DiscountBond + let admin: SignerWithAddress + let alice: SignerWithAddress + let bob: SignerWithAddress + let carol: SignerWithAddress + + before('Create bond', async () => { + ;[admin, alice, bob, carol] = 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 tx = await bondFactory + .connect(admin) + .createBond( + 'Discount', + 'dB26W001', + 'T-Bills@26Weeks#001', + MOCK_PRICE, + parseUnits('1000000', 18), + 'USBills', + usdcToken.address, + MOCK_MATURITY_TIME, + 'US912796YB94', + ) + + const res = await tx.wait() + 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, '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, '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) + + // 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.") + 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( + 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', + ) + + 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 () => { + 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) => { + 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 (await bondToken.getPrice()).ask + + await bondToken.connect(user).mintByUnderlyingAmount(user.address, 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", + ) + } + + 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')), + 'It should be able to grant inventoryAmount', + ) + + 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 (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", + ) + }) + + 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), + "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(`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) + + const withdrawAmount = usdcOfBond.div(2) + await bondFactory.connect(admin).underlyingOut(bondToken.address, 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', + { + 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) + 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.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', + ) + + 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/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' 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 +} 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}