diff --git a/.circleci/config.yml b/.circleci/config.yml index 1f33086c..98f55f9c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -68,19 +68,20 @@ jobs: name: Report gas changes command: npx codechecks - coverage: - executor: default - steps: - - checkout - - attach_workspace: - at: /tmp/workspace - - run: - name: Run coverage tests - command: yarn coverage - - run: - name: Upload coverage - command: | - bash <(curl -s https://codecov.io/bash) +# FIXME: https://github.com/sc-forks/solidity-coverage/issues/574 +# coverage: +# executor: default +# steps: +# - checkout +# - attach_workspace: +# at: /tmp/workspace +# - run: +# name: Run coverage tests +# command: yarn coverage +# - run: +# name: Upload coverage +# command: | +# bash <(curl -s https://codecov.io/bash) workflows: version: 2 @@ -96,6 +97,6 @@ workflows: - test: requires: - compile - - coverage: - requires: - - compile +# - coverage: +# requires: +# - compile diff --git a/.gitignore b/.gitignore index 27c9f05d..a71e254f 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,4 @@ build # artifacts cache artifacts -.openzeppelin/unknown-*.json +.husky \ No newline at end of file diff --git a/.openzeppelin/goerli.json b/.openzeppelin/goerli.json new file mode 100644 index 00000000..b39f36c8 --- /dev/null +++ b/.openzeppelin/goerli.json @@ -0,0 +1,1109 @@ +{ + "manifestVersion": "3.1", + "impls": { + "84dece82968538be3061b96eba9ebf393b48892f1cc2d730d20711cfa3f49e86": { + "address": "0x70318289179C01FdBcce8c4071c6556cbd2C613b", + "txHash": "0xbd0644fa6410d20a83a4535379a65c844cf8289ad9acba9f592575b3a6d25954", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "Validators", + "label": "publicKeys", + "type": "t_mapping(t_bytes32,t_bool)", + "src": "contracts/Validators.sol:19" + }, + { + "contract": "Validators", + "label": "pool", + "type": "t_address", + "src": "contracts/Validators.sol:22" + }, + { + "contract": "Validators", + "label": "solos", + "type": "t_address", + "src": "contracts/Validators.sol:25" + } + ], + "types": { + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_bool": { + "label": "bool" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + } + } + } + }, + "3c2ba5b01bcebe2c48833d843424b7dbcdfa3752334326296bfeb99eab2e4b99": { + "address": "0x50C3723bBF5074CD9Da1754713d1F48C38B26Da1", + "txHash": "0x3cafe0b96a077d80ba53ba620ed38e845be67eec730465b992ddd6562cb84101", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "Pool", + "label": "collectedAmount", + "type": "t_uint256", + "src": "contracts/collectors/Pool.sol:25" + }, + { + "contract": "Pool", + "label": "withdrawalCredentials", + "type": "t_bytes32", + "src": "contracts/collectors/Pool.sol:28" + }, + { + "contract": "Pool", + "label": "validatorRegistration", + "type": "t_contract(IDepositContract)4685", + "src": "contracts/collectors/Pool.sol:31" + }, + { + "contract": "Pool", + "label": "stakedEthToken", + "type": "t_contract(IStakedEthToken)5227", + "src": "contracts/collectors/Pool.sol:34" + }, + { + "contract": "Pool", + "label": "validators", + "type": "t_contract(IValidators)5275", + "src": "contracts/collectors/Pool.sol:37" + } + ], + "types": { + "t_uint256": { + "label": "uint256" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_contract(IDepositContract)4685": { + "label": "contract IDepositContract" + }, + "t_contract(IStakedEthToken)5227": { + "label": "contract IStakedEthToken" + }, + "t_contract(IValidators)5275": { + "label": "contract IValidators" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_bool": { + "label": "bool" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + } + } + } + }, + "3a535bc8d9b69aa26341824b12caf3d267e2712fbe4e4a0e389fb306a6ff29c8": { + "address": "0x2bC925698e1Dba66541f7529F0D7d59632bEA695", + "txHash": "0x862d4631f3df71551a4631bb105d10fec96e5888f114c7d2763bebd2997eda49", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "ERC20Upgradeable", + "label": "_allowances", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "contracts/tokens/ERC20Upgradeable.sol:38" + }, + { + "contract": "ERC20Upgradeable", + "label": "_name", + "type": "t_string_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:40" + }, + { + "contract": "ERC20Upgradeable", + "label": "_symbol", + "type": "t_string_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:41" + }, + { + "contract": "ERC20Upgradeable", + "label": "_decimals", + "type": "t_uint8", + "src": "contracts/tokens/ERC20Upgradeable.sol:42" + }, + { + "contract": "ERC20Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)44_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:223" + }, + { + "contract": "EIP712Upgradeable", + "label": "_HASHED_NAME", + "type": "t_bytes32", + "src": "contracts/tokens/EIP712Upgradeable.sol:27" + }, + { + "contract": "EIP712Upgradeable", + "label": "_HASHED_VERSION", + "type": "t_bytes32", + "src": "contracts/tokens/EIP712Upgradeable.sol:28" + }, + { + "contract": "EIP712Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "contracts/tokens/EIP712Upgradeable.sol:124" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "_nonces", + "type": "t_mapping(t_address,t_struct(Counter)951_storage)", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:24" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "_PERMIT_TYPEHASH", + "type": "t_bytes32", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:27" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:86" + }, + { + "contract": "StakedEthToken", + "label": "totalDeposits", + "type": "t_uint256", + "src": "contracts/tokens/StakedEthToken.sol:20" + }, + { + "contract": "StakedEthToken", + "label": "deposits", + "type": "t_mapping(t_address,t_uint256)", + "src": "contracts/tokens/StakedEthToken.sol:23" + }, + { + "contract": "StakedEthToken", + "label": "pool", + "type": "t_address", + "src": "contracts/tokens/StakedEthToken.sol:26" + }, + { + "contract": "StakedEthToken", + "label": "rewardEthToken", + "type": "t_contract(IRewardEthToken)5069", + "src": "contracts/tokens/StakedEthToken.sol:29" + } + ], + "types": { + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)" + }, + "t_address": { + "label": "address" + }, + "t_contract(IRewardEthToken)5069": { + "label": "contract IRewardEthToken" + }, + "t_mapping(t_address,t_struct(Counter)951_storage)": { + "label": "mapping(address => struct CountersUpgradeable.Counter)" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_string_storage": { + "label": "string" + }, + "t_uint8": { + "label": "uint8" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_bool": { + "label": "bool" + } + } + } + }, + "5370a49c5717f9aacd12db411bd25748fae480eab79cf2712c7c5c3aa1295a90": { + "address": "0x209272625648DCA2077530Ef152081d1bB8a0bF7", + "txHash": "0xa60095d5c63718ed32ee0a2fa4fdf5132e294573781171372566a72c699049d0", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "ERC20Upgradeable", + "label": "_allowances", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "contracts/tokens/ERC20Upgradeable.sol:38" + }, + { + "contract": "ERC20Upgradeable", + "label": "_name", + "type": "t_string_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:40" + }, + { + "contract": "ERC20Upgradeable", + "label": "_symbol", + "type": "t_string_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:41" + }, + { + "contract": "ERC20Upgradeable", + "label": "_decimals", + "type": "t_uint8", + "src": "contracts/tokens/ERC20Upgradeable.sol:42" + }, + { + "contract": "ERC20Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)44_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:223" + }, + { + "contract": "EIP712Upgradeable", + "label": "_HASHED_NAME", + "type": "t_bytes32", + "src": "contracts/tokens/EIP712Upgradeable.sol:27" + }, + { + "contract": "EIP712Upgradeable", + "label": "_HASHED_VERSION", + "type": "t_bytes32", + "src": "contracts/tokens/EIP712Upgradeable.sol:28" + }, + { + "contract": "EIP712Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "contracts/tokens/EIP712Upgradeable.sol:124" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "_nonces", + "type": "t_mapping(t_address,t_struct(Counter)951_storage)", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:24" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "_PERMIT_TYPEHASH", + "type": "t_bytes32", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:27" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:86" + }, + { + "contract": "RewardEthToken", + "label": "stakedEthToken", + "type": "t_contract(IStakedEthToken)5227", + "src": "contracts/tokens/RewardEthToken.sol:22" + }, + { + "contract": "RewardEthToken", + "label": "oracles", + "type": "t_address", + "src": "contracts/tokens/RewardEthToken.sol:25" + }, + { + "contract": "RewardEthToken", + "label": "checkpoints", + "type": "t_mapping(t_address,t_struct(Checkpoint)4971_storage)", + "src": "contracts/tokens/RewardEthToken.sol:28" + }, + { + "contract": "RewardEthToken", + "label": "maintainer", + "type": "t_address", + "src": "contracts/tokens/RewardEthToken.sol:31" + }, + { + "contract": "RewardEthToken", + "label": "maintainerFee", + "type": "t_uint256", + "src": "contracts/tokens/RewardEthToken.sol:34" + }, + { + "contract": "RewardEthToken", + "label": "totalRewards", + "type": "t_uint128", + "src": "contracts/tokens/RewardEthToken.sol:37" + }, + { + "contract": "RewardEthToken", + "label": "rewardPerToken", + "type": "t_uint128", + "src": "contracts/tokens/RewardEthToken.sol:40" + }, + { + "contract": "RewardEthToken", + "label": "lastUpdateTimestamp", + "type": "t_uint256", + "src": "contracts/tokens/RewardEthToken.sol:43" + } + ], + "types": { + "t_contract(IStakedEthToken)5227": { + "label": "contract IStakedEthToken" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_address,t_struct(Checkpoint)4971_storage)": { + "label": "mapping(address => struct IRewardEthToken.Checkpoint)" + }, + "t_uint256": { + "label": "uint256" + }, + "t_uint128": { + "label": "uint128" + }, + "t_mapping(t_address,t_struct(Counter)951_storage)": { + "label": "mapping(address => struct CountersUpgradeable.Counter)" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_string_storage": { + "label": "string" + }, + "t_uint8": { + "label": "uint8" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_bool": { + "label": "bool" + } + } + } + }, + "e43b57215f4a8a0604ed9cf0c3db3ee217fca96cdd0c8807f931fc346c88ee96": { + "address": "0x45903E6De7Ee93e99Ae57DD1dCB4dDe61131F2bd", + "txHash": "0xc6fd0d563aebc0497f3be45b4129c3aa3fb188f6439870d9bb7f224e5f292177", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ReentrancyGuardUpgradeable", + "label": "_status", + "type": "t_uint256", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:37" + }, + { + "contract": "ReentrancyGuardUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:67" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "Oracles", + "label": "totalRewardsUpdatePeriod", + "type": "t_uint256", + "src": "contracts/Oracles.sol:26" + }, + { + "contract": "Oracles", + "label": "candidates", + "type": "t_mapping(t_bytes32,t_uint256)", + "src": "contracts/Oracles.sol:29" + }, + { + "contract": "Oracles", + "label": "rewardEthUniswapPairs", + "type": "t_array(t_address)dyn_storage", + "src": "contracts/Oracles.sol:32" + }, + { + "contract": "Oracles", + "label": "submittedVotes", + "type": "t_mapping(t_bytes32,t_bool)", + "src": "contracts/Oracles.sol:35" + }, + { + "contract": "Oracles", + "label": "rewardEthToken", + "type": "t_contract(IRewardEthToken)5069", + "src": "contracts/Oracles.sol:38" + }, + { + "contract": "Oracles", + "label": "totalRewardsNonce", + "type": "t_struct(Counter)951_storage", + "src": "contracts/Oracles.sol:41" + } + ], + "types": { + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)" + }, + "t_contract(IRewardEthToken)5069": { + "label": "contract IRewardEthToken" + }, + "t_struct(Counter)951_storage": { + "label": "struct CountersUpgradeable.Counter" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_bool": { + "label": "bool" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + } + } + } + }, + "0b75bd82778d4c360318bd59e498ceb95499641b67ab7608cee37b6c643a88ab": { + "address": "0xAB10021EA5d14156f52414C492bf81859d0b21F6", + "txHash": "0xe71758c8df2927dac4f8c3854cbefd5fa73d95dcde38d68a91718d7a702b0dc5", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:25" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:30" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)39_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "Pool", + "label": "activatedValidators", + "type": "t_uint256", + "src": "contracts/collectors/Pool.sol:25" + }, + { + "contract": "Pool", + "label": "withdrawalCredentials", + "type": "t_bytes32", + "src": "contracts/collectors/Pool.sol:28" + }, + { + "contract": "Pool", + "label": "validatorRegistration", + "type": "t_contract(IDepositContract)5174", + "src": "contracts/collectors/Pool.sol:31" + }, + { + "contract": "Pool", + "label": "stakedEthToken", + "type": "t_contract(IStakedEthToken)5810", + "src": "contracts/collectors/Pool.sol:34" + }, + { + "contract": "Pool", + "label": "validators", + "type": "t_contract(IValidators)5858", + "src": "contracts/collectors/Pool.sol:37" + }, + { + "contract": "Pool", + "label": "oracles", + "type": "t_address", + "src": "contracts/collectors/Pool.sol:40" + }, + { + "contract": "Pool", + "label": "activations", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_uint256))", + "src": "contracts/collectors/Pool.sol:43" + }, + { + "contract": "Pool", + "label": "pendingValidators", + "type": "t_uint256", + "src": "contracts/collectors/Pool.sol:46" + }, + { + "contract": "Pool", + "label": "minActivatingDeposit", + "type": "t_uint256", + "src": "contracts/collectors/Pool.sol:49" + }, + { + "contract": "Pool", + "label": "pendingValidatorsLimit", + "type": "t_uint256", + "src": "contracts/collectors/Pool.sol:52" + } + ], + "types": { + "t_uint256": { + "label": "uint256" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_contract(IDepositContract)5174": { + "label": "contract IDepositContract" + }, + "t_contract(IStakedEthToken)5810": { + "label": "contract IStakedEthToken" + }, + "t_contract(IValidators)5858": { + "label": "contract IValidators" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_uint256))": { + "label": "mapping(address => mapping(uint256 => uint256))" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)" + }, + "t_mapping(t_bytes32,t_struct(RoleData)39_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_struct(RoleData)39_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_struct(AddressSet)1421_storage" + }, + { + "label": "adminRole", + "type": "t_bytes32" + } + ] + }, + "t_struct(AddressSet)1421_storage": { + "label": "struct EnumerableSetUpgradeable.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)1156_storage" + } + ] + }, + "t_struct(Set)1156_storage": { + "label": "struct EnumerableSetUpgradeable.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "label": "_indexes", + "type": "t_mapping(t_bytes32,t_uint256)" + } + ] + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_bool": { + "label": "bool" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + } + } + } + }, + "88b20c6014e9428305028f15b31ccca5163a9836c693c992172ff3122e72bab3": { + "address": "0x35e467609D1982BCd7EcAff4e3f1fb22640CF4EF", + "txHash": "0x3922f5ae602033e445f8e191c522d4696a7834c83a03dbb7b548975e6734d015", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:25" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:30" + }, + { + "contract": "ReentrancyGuardUpgradeable", + "label": "_status", + "type": "t_uint256", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:37" + }, + { + "contract": "ReentrancyGuardUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:67" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)39_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "Oracles", + "label": "syncPeriod", + "type": "t_uint256", + "src": "contracts/Oracles.sol:26" + }, + { + "contract": "Oracles", + "label": "candidates", + "type": "t_mapping(t_bytes32,t_uint256)", + "src": "contracts/Oracles.sol:29" + }, + { + "contract": "Oracles", + "label": "rewardEthUniswapPairs", + "type": "t_array(t_address)dyn_storage", + "src": "contracts/Oracles.sol:32" + }, + { + "contract": "Oracles", + "label": "submittedVotes", + "type": "t_mapping(t_bytes32,t_bool)", + "src": "contracts/Oracles.sol:35" + }, + { + "contract": "Oracles", + "label": "rewardEthToken", + "type": "t_contract(IRewardEthToken)5652", + "src": "contracts/Oracles.sol:38" + }, + { + "contract": "Oracles", + "label": "nonce", + "type": "t_struct(Counter)1105_storage", + "src": "contracts/Oracles.sol:41" + }, + { + "contract": "Oracles", + "label": "pool", + "type": "t_contract(IPool)5533", + "src": "contracts/Oracles.sol:44" + } + ], + "types": { + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)" + }, + "t_bool": { + "label": "bool" + }, + "t_contract(IRewardEthToken)5652": { + "label": "contract IRewardEthToken" + }, + "t_struct(Counter)1105_storage": { + "label": "struct CountersUpgradeable.Counter", + "members": [ + { + "label": "_value", + "type": "t_uint256" + } + ] + }, + "t_contract(IPool)5533": { + "label": "contract IPool" + }, + "t_mapping(t_bytes32,t_struct(RoleData)39_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_struct(RoleData)39_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_struct(AddressSet)1421_storage" + }, + { + "label": "adminRole", + "type": "t_bytes32" + } + ] + }, + "t_struct(AddressSet)1421_storage": { + "label": "struct EnumerableSetUpgradeable.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)1156_storage" + } + ] + }, + "t_struct(Set)1156_storage": { + "label": "struct EnumerableSetUpgradeable.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage" + }, + { + "label": "_indexes", + "type": "t_mapping(t_bytes32,t_uint256)" + } + ] + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + } + } + } + } + }, + "admin": { + "address": "0xbba3f4dDD4F705aD2028ee2da64fF3166bDe8cA8", + "txHash": "0x8f4bd6ede50b7fc589807a9277c3cd2624d2b5b4f9cda20b589aa2cb8b5a0cc5" + } +} diff --git a/.openzeppelin/unknown-31337.json b/.openzeppelin/unknown-31337.json new file mode 100644 index 00000000..fe63059f --- /dev/null +++ b/.openzeppelin/unknown-31337.json @@ -0,0 +1,731 @@ +{ + "manifestVersion": "3.1", + "impls": { + "84dece82968538be3061b96eba9ebf393b48892f1cc2d730d20711cfa3f49e86": { + "address": "0xa34E1010E2b76abdf7399E6C88147D0FAfE28e90", + "txHash": "0x1a4332730b0fb57cf85d9cd1e69c2d90e708c6074786f56cbc05fbeee47e29db", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "Validators", + "label": "publicKeys", + "type": "t_mapping(t_bytes32,t_bool)", + "src": "contracts/Validators.sol:19" + }, + { + "contract": "Validators", + "label": "pool", + "type": "t_address", + "src": "contracts/Validators.sol:22" + }, + { + "contract": "Validators", + "label": "solos", + "type": "t_address", + "src": "contracts/Validators.sol:25" + } + ], + "types": { + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_bool": { + "label": "bool" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + } + } + } + }, + "3c2ba5b01bcebe2c48833d843424b7dbcdfa3752334326296bfeb99eab2e4b99": { + "address": "0xf6a519699dd2f66a8Aa1F49B81C73690F104647f", + "txHash": "0xd1a832b29db69905f48a075effac4d274565ff837d4a083712fb3dfa49a704f6", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "Pool", + "label": "collectedAmount", + "type": "t_uint256", + "src": "contracts/collectors/Pool.sol:25" + }, + { + "contract": "Pool", + "label": "withdrawalCredentials", + "type": "t_bytes32", + "src": "contracts/collectors/Pool.sol:28" + }, + { + "contract": "Pool", + "label": "validatorRegistration", + "type": "t_contract(IDepositContract)4685", + "src": "contracts/collectors/Pool.sol:31" + }, + { + "contract": "Pool", + "label": "stakedEthToken", + "type": "t_contract(IStakedEthToken)5227", + "src": "contracts/collectors/Pool.sol:34" + }, + { + "contract": "Pool", + "label": "validators", + "type": "t_contract(IValidators)5275", + "src": "contracts/collectors/Pool.sol:37" + } + ], + "types": { + "t_uint256": { + "label": "uint256" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_contract(IDepositContract)4685": { + "label": "contract IDepositContract" + }, + "t_contract(IStakedEthToken)5227": { + "label": "contract IStakedEthToken" + }, + "t_contract(IValidators)5275": { + "label": "contract IValidators" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_bool": { + "label": "bool" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + } + } + } + }, + "3a535bc8d9b69aa26341824b12caf3d267e2712fbe4e4a0e389fb306a6ff29c8": { + "address": "0x6A8a1716a44f700af56ea52D44B916A50333A369", + "txHash": "0x5e214beece1c31c69f3b927f96c0547ce744c5c3cc4c1dca171bb26fcd5a839b", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "ERC20Upgradeable", + "label": "_allowances", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "contracts/tokens/ERC20Upgradeable.sol:38" + }, + { + "contract": "ERC20Upgradeable", + "label": "_name", + "type": "t_string_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:40" + }, + { + "contract": "ERC20Upgradeable", + "label": "_symbol", + "type": "t_string_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:41" + }, + { + "contract": "ERC20Upgradeable", + "label": "_decimals", + "type": "t_uint8", + "src": "contracts/tokens/ERC20Upgradeable.sol:42" + }, + { + "contract": "ERC20Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)44_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:223" + }, + { + "contract": "EIP712Upgradeable", + "label": "_HASHED_NAME", + "type": "t_bytes32", + "src": "contracts/tokens/EIP712Upgradeable.sol:27" + }, + { + "contract": "EIP712Upgradeable", + "label": "_HASHED_VERSION", + "type": "t_bytes32", + "src": "contracts/tokens/EIP712Upgradeable.sol:28" + }, + { + "contract": "EIP712Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "contracts/tokens/EIP712Upgradeable.sol:124" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "_nonces", + "type": "t_mapping(t_address,t_struct(Counter)951_storage)", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:24" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "_PERMIT_TYPEHASH", + "type": "t_bytes32", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:27" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:86" + }, + { + "contract": "StakedEthToken", + "label": "totalDeposits", + "type": "t_uint256", + "src": "contracts/tokens/StakedEthToken.sol:20" + }, + { + "contract": "StakedEthToken", + "label": "deposits", + "type": "t_mapping(t_address,t_uint256)", + "src": "contracts/tokens/StakedEthToken.sol:23" + }, + { + "contract": "StakedEthToken", + "label": "pool", + "type": "t_address", + "src": "contracts/tokens/StakedEthToken.sol:26" + }, + { + "contract": "StakedEthToken", + "label": "rewardEthToken", + "type": "t_contract(IRewardEthToken)5069", + "src": "contracts/tokens/StakedEthToken.sol:29" + } + ], + "types": { + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)" + }, + "t_address": { + "label": "address" + }, + "t_contract(IRewardEthToken)5069": { + "label": "contract IRewardEthToken" + }, + "t_mapping(t_address,t_struct(Counter)951_storage)": { + "label": "mapping(address => struct CountersUpgradeable.Counter)" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_string_storage": { + "label": "string" + }, + "t_uint8": { + "label": "uint8" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_bool": { + "label": "bool" + } + } + } + }, + "5370a49c5717f9aacd12db411bd25748fae480eab79cf2712c7c5c3aa1295a90": { + "address": "0x46B7232bc7392b157371eBFcD4618Ca9CEedb1bd", + "txHash": "0xdc0f09fd8ffd9aeba4dcccf0994a2d26c61a7d418bf7d01fdaaa7bdc70a7a2c9", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "ERC20Upgradeable", + "label": "_allowances", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "src": "contracts/tokens/ERC20Upgradeable.sol:38" + }, + { + "contract": "ERC20Upgradeable", + "label": "_name", + "type": "t_string_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:40" + }, + { + "contract": "ERC20Upgradeable", + "label": "_symbol", + "type": "t_string_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:41" + }, + { + "contract": "ERC20Upgradeable", + "label": "_decimals", + "type": "t_uint8", + "src": "contracts/tokens/ERC20Upgradeable.sol:42" + }, + { + "contract": "ERC20Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)44_storage", + "src": "contracts/tokens/ERC20Upgradeable.sol:223" + }, + { + "contract": "EIP712Upgradeable", + "label": "_HASHED_NAME", + "type": "t_bytes32", + "src": "contracts/tokens/EIP712Upgradeable.sol:27" + }, + { + "contract": "EIP712Upgradeable", + "label": "_HASHED_VERSION", + "type": "t_bytes32", + "src": "contracts/tokens/EIP712Upgradeable.sol:28" + }, + { + "contract": "EIP712Upgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "contracts/tokens/EIP712Upgradeable.sol:124" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "_nonces", + "type": "t_mapping(t_address,t_struct(Counter)951_storage)", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:24" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "_PERMIT_TYPEHASH", + "type": "t_bytes32", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:27" + }, + { + "contract": "ERC20PermitUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "contracts/tokens/ERC20PermitUpgradeable.sol:86" + }, + { + "contract": "RewardEthToken", + "label": "stakedEthToken", + "type": "t_contract(IStakedEthToken)5227", + "src": "contracts/tokens/RewardEthToken.sol:22" + }, + { + "contract": "RewardEthToken", + "label": "oracles", + "type": "t_address", + "src": "contracts/tokens/RewardEthToken.sol:25" + }, + { + "contract": "RewardEthToken", + "label": "checkpoints", + "type": "t_mapping(t_address,t_struct(Checkpoint)4971_storage)", + "src": "contracts/tokens/RewardEthToken.sol:28" + }, + { + "contract": "RewardEthToken", + "label": "maintainer", + "type": "t_address", + "src": "contracts/tokens/RewardEthToken.sol:31" + }, + { + "contract": "RewardEthToken", + "label": "maintainerFee", + "type": "t_uint256", + "src": "contracts/tokens/RewardEthToken.sol:34" + }, + { + "contract": "RewardEthToken", + "label": "totalRewards", + "type": "t_uint128", + "src": "contracts/tokens/RewardEthToken.sol:37" + }, + { + "contract": "RewardEthToken", + "label": "rewardPerToken", + "type": "t_uint128", + "src": "contracts/tokens/RewardEthToken.sol:40" + }, + { + "contract": "RewardEthToken", + "label": "lastUpdateTimestamp", + "type": "t_uint256", + "src": "contracts/tokens/RewardEthToken.sol:43" + } + ], + "types": { + "t_contract(IStakedEthToken)5227": { + "label": "contract IStakedEthToken" + }, + "t_address": { + "label": "address" + }, + "t_mapping(t_address,t_struct(Checkpoint)4971_storage)": { + "label": "mapping(address => struct IRewardEthToken.Checkpoint)" + }, + "t_uint256": { + "label": "uint256" + }, + "t_uint128": { + "label": "uint128" + }, + "t_mapping(t_address,t_struct(Counter)951_storage)": { + "label": "mapping(address => struct CountersUpgradeable.Counter)" + }, + "t_bytes32": { + "label": "bytes32" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))" + }, + "t_string_storage": { + "label": "string" + }, + "t_uint8": { + "label": "uint8" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_bool": { + "label": "bool" + } + } + } + }, + "e43b57215f4a8a0604ed9cf0c3db3ee217fca96cdd0c8807f931fc346c88ee96": { + "address": "0xfdec24BB3055BE9578300f1541d5e0Ee4eDa6261", + "txHash": "0x4b2bce9a29734672917727e27a47d4a44b20953b04be7f4215fae4d77058fdec", + "layout": { + "storage": [ + { + "contract": "Initializable", + "label": "_initialized", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:24" + }, + { + "contract": "Initializable", + "label": "_initializing", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol:29" + }, + { + "contract": "ReentrancyGuardUpgradeable", + "label": "_status", + "type": "t_uint256", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:37" + }, + { + "contract": "ReentrancyGuardUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol:67" + }, + { + "contract": "ContextUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)50_storage", + "src": "@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol:31" + }, + { + "contract": "PausableUpgradeable", + "label": "_paused", + "type": "t_bool", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:28" + }, + { + "contract": "PausableUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol:96" + }, + { + "contract": "AccessControlUpgradeable", + "label": "_roles", + "type": "t_mapping(t_bytes32,t_struct(RoleData)84_storage)", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "contract": "AccessControlUpgradeable", + "label": "__gap", + "type": "t_array(t_uint256)49_storage", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:225" + }, + { + "contract": "Oracles", + "label": "totalRewardsUpdatePeriod", + "type": "t_uint256", + "src": "contracts/Oracles.sol:26" + }, + { + "contract": "Oracles", + "label": "candidates", + "type": "t_mapping(t_bytes32,t_uint256)", + "src": "contracts/Oracles.sol:29" + }, + { + "contract": "Oracles", + "label": "rewardEthUniswapPairs", + "type": "t_array(t_address)dyn_storage", + "src": "contracts/Oracles.sol:32" + }, + { + "contract": "Oracles", + "label": "submittedVotes", + "type": "t_mapping(t_bytes32,t_bool)", + "src": "contracts/Oracles.sol:35" + }, + { + "contract": "Oracles", + "label": "rewardEthToken", + "type": "t_contract(IRewardEthToken)5069", + "src": "contracts/Oracles.sol:38" + }, + { + "contract": "Oracles", + "label": "totalRewardsNonce", + "type": "t_struct(Counter)951_storage", + "src": "contracts/Oracles.sol:41" + } + ], + "types": { + "t_uint256": { + "label": "uint256" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)" + }, + "t_array(t_address)dyn_storage": { + "label": "address[]" + }, + "t_mapping(t_bytes32,t_bool)": { + "label": "mapping(bytes32 => bool)" + }, + "t_contract(IRewardEthToken)5069": { + "label": "contract IRewardEthToken" + }, + "t_struct(Counter)951_storage": { + "label": "struct CountersUpgradeable.Counter" + }, + "t_mapping(t_bytes32,t_struct(RoleData)84_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]" + }, + "t_bool": { + "label": "bool" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]" + } + } + } + } + }, + "admin": { + "address": "0x3EB0175dcD67d3AB139aA03165e24AA2188A4C22", + "txHash": "0x3490ab3e78ab96f5059d9ea25c009d476eec9d8c4d4d7009bb33f130e5046ab7" + } +} diff --git a/.solhint.json b/.solhint.json index adaa2887..688b72a6 100644 --- a/.solhint.json +++ b/.solhint.json @@ -3,6 +3,7 @@ "rules": { "compiler-version": "off", "mark-callable-contracts": "off", + "reason-string": "off", "no-empty-blocks": "off", "func-visibility": ["warn", { "ignoreConstructors": true }] } diff --git a/abi/IOracles.json b/abi/IOracles.json deleted file mode 100644 index 9bd56401..00000000 --- a/abi/IOracles.json +++ /dev/null @@ -1,229 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address[]", - "name": "rewardEthUniswapPairs", - "type": "address[]" - } - ], - "name": "RewardEthUniswapPairsUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "totalRewardsUpdatePeriod", - "type": "uint256" - } - ], - "name": "TotalRewardsUpdatePeriodUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "oracle", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "nonce", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "totalRewards", - "type": "uint256" - } - ], - "name": "TotalRewardsVoteSubmitted", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "addOracle", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_candidateId", - "type": "bytes32" - } - ], - "name": "candidates", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getRewardEthUniswapPairs", - "outputs": [ - { - "internalType": "address[]", - "name": "", - "type": "address[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_oracle", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_totalRewards", - "type": "uint256" - } - ], - "name": "hasTotalRewardsVote", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_admin", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardEthToken", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_totalRewardsUpdatePeriod", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "isOracle", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "removeOracle", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "_rewardEthUniswapPairs", - "type": "address[]" - } - ], - "name": "setRewardEthUniswapPairs", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_newTotalRewardsUpdatePeriod", - "type": "uint256" - } - ], - "name": "setTotalRewardsUpdatePeriod", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "totalRewardsUpdatePeriod", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_newTotalRewards", - "type": "uint256" - } - ], - "name": "voteForTotalRewards", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/abi/IPool.json b/abi/IPool.json deleted file mode 100644 index 710dc6c4..00000000 --- a/abi/IPool.json +++ /dev/null @@ -1,156 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes", - "name": "publicKey", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "address", - "name": "operator", - "type": "address" - } - ], - "name": "ValidatorRegistered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "withdrawalCredentials", - "type": "bytes32" - } - ], - "name": "WithdrawalCredentialsUpdated", - "type": "event" - }, - { - "inputs": [], - "name": "addDeposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [], - "name": "collectedAmount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_admin", - "type": "address" - }, - { - "internalType": "address", - "name": "_stakedEthToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_validatorRegistration", - "type": "address" - }, - { - "internalType": "address", - "name": "_validators", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "_withdrawalCredentials", - "type": "bytes32" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes", - "name": "publicKey", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "depositDataRoot", - "type": "bytes32" - } - ], - "internalType": "struct IPool.Validator", - "name": "_validator", - "type": "tuple" - } - ], - "name": "registerValidator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_withdrawalCredentials", - "type": "bytes32" - } - ], - "name": "setWithdrawalCredentials", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "validatorRegistration", - "outputs": [ - { - "internalType": "contract IDepositContract", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "withdrawalCredentials", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/abi/ISolos.json b/abi/ISolos.json deleted file mode 100644 index 6e67bcc1..00000000 --- a/abi/ISolos.json +++ /dev/null @@ -1,281 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "cancelLockDuration", - "type": "uint256" - } - ], - "name": "CancelLockDurationUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "soloId", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "withdrawalCredentials", - "type": "bytes32" - } - ], - "name": "DepositAdded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "soloId", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "withdrawalCredentials", - "type": "bytes32" - } - ], - "name": "DepositCanceled", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "validatorPrice", - "type": "uint256" - } - ], - "name": "ValidatorPriceUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "soloId", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "publicKey", - "type": "bytes" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "price", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "operator", - "type": "address" - } - ], - "name": "ValidatorRegistered", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_withdrawalCredentials", - "type": "bytes32" - } - ], - "name": "addDeposit", - "outputs": [], - "stateMutability": "payable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_withdrawalCredentials", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "cancelDeposit", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "cancelLockDuration", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "bytes", - "name": "publicKey", - "type": "bytes" - }, - { - "internalType": "bytes", - "name": "signature", - "type": "bytes" - }, - { - "internalType": "bytes32", - "name": "depositDataRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "soloId", - "type": "bytes32" - } - ], - "internalType": "struct ISolos.Validator", - "name": "_validator", - "type": "tuple" - } - ], - "name": "registerValidator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "newCancelLockDuration", - "type": "uint256" - } - ], - "name": "setCancelLockDuration", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "_validatorPrice", - "type": "uint256" - } - ], - "name": "setValidatorPrice", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_soloId", - "type": "bytes32" - } - ], - "name": "solos", - "outputs": [ - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "withdrawalCredentials", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "releaseTime", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "validatorPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "validatorRegistration", - "outputs": [ - { - "internalType": "contract IDepositContract", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/abi/IStakedEthToken.json b/abi/IStakedEthToken.json deleted file mode 100644 index 231e67e0..00000000 --- a/abi/IStakedEthToken.json +++ /dev/null @@ -1,239 +0,0 @@ -[ - { - "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": 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": [ - { - "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": "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": [ - { - "internalType": "address", - "name": "_admin", - "type": "address" - }, - { - "internalType": "address", - "name": "_rewardEthToken", - "type": "address" - }, - { - "internalType": "address", - "name": "_pool", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "mint", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "totalDeposits", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "totalSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "transferFrom", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/abi/IValidators.json b/abi/IValidators.json deleted file mode 100644 index f3519a7c..00000000 --- a/abi/IValidators.json +++ /dev/null @@ -1,102 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "addOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_admin", - "type": "address" - }, - { - "internalType": "address", - "name": "_pool", - "type": "address" - }, - { - "internalType": "address", - "name": "_solos", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "isOperator", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_publicKey", - "type": "bytes32" - } - ], - "name": "publicKeys", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "_validatorId", - "type": "bytes32" - } - ], - "name": "register", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_account", - "type": "address" - } - ], - "name": "removeOperator", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - } -] diff --git a/abi/IRewardEthToken.json b/abi/Oracles.json similarity index 54% rename from abi/IRewardEthToken.json rename to abi/Oracles.json index 8dfd39e1..9a49c61e 100644 --- a/abi/IRewardEthToken.json +++ b/abi/Oracles.json @@ -1,27 +1,90 @@ [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "indexed": true, "internalType": "address", - "name": "owner", + "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", - "name": "spender", + "name": "sender", "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "Approval", + "name": "RoleRevoked", "type": "event" }, { @@ -30,11 +93,17 @@ { "indexed": false, "internalType": "uint256", - "name": "maintainerFee", + "name": "syncPeriod", "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" } ], - "name": "MaintainerFeeUpdated", + "name": "SyncPeriodUpdated", "type": "event" }, { @@ -43,83 +112,144 @@ { "indexed": false, "internalType": "address", - "name": "maintainer", + "name": "account", "type": "address" } ], - "name": "MaintainerUpdated", + "name": "Unpaused", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": false, - "internalType": "uint256", - "name": "periodRewards", - "type": "uint256" + "indexed": true, + "internalType": "address", + "name": "oracle", + "type": "address" }, { "indexed": false, "internalType": "uint256", - "name": "totalRewards", + "name": "nonce", "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "rewardPerToken", + "name": "totalRewards", "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "lastUpdateTimestamp", + "name": "activatedValidators", "type": "uint256" } ], - "name": "RewardsUpdated", + "name": "VoteSubmitted", "type": "event" }, { - "anonymous": false, + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ORACLE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { "inputs": [ { - "indexed": true, "internalType": "address", - "name": "from", + "name": "_account", "type": "address" - }, + } + ], + "name": "addAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "indexed": true, "internalType": "address", - "name": "to", + "name": "_account", "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "value", - "type": "uint256" } ], - "name": "Transfer", - "type": "event" + "name": "addOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "owner", + "name": "_account", "type": "address" - }, + } + ], + "name": "addPauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "allowance", + "name": "candidates", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "currentNonce", "outputs": [ { "internalType": "uint256", @@ -133,36 +263,55 @@ { "inputs": [ { - "internalType": "address", - "name": "spender", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "uint256", - "name": "amount", + "name": "index", "type": "uint256" } ], - "name": "approve", + "name": "getRoleMember", "outputs": [ { - "internalType": "bool", + "internalType": "address", "name": "", - "type": "bool" + "type": "address" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { "inputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" } ], - "name": "balanceOf", + "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", @@ -175,23 +324,41 @@ }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", "name": "account", "type": "address" } ], - "name": "checkpoints", - "outputs": [ + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "uint128", - "name": "", - "type": "uint128" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { - "internalType": "uint128", + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", "name": "", - "type": "uint128" + "type": "bool" } ], "stateMutability": "view", @@ -201,82 +368,64 @@ "inputs": [ { "internalType": "address", - "name": "_admin", - "type": "address" - }, - { - "internalType": "address", - "name": "_stakedEthToken", + "name": "_oracle", "type": "address" }, { - "internalType": "address", - "name": "_oracles", - "type": "address" - }, - { - "internalType": "address", - "name": "_maintainer", - "type": "address" + "internalType": "uint256", + "name": "_totalRewards", + "type": "uint256" }, { "internalType": "uint256", - "name": "_maintainerFee", + "name": "_activatedValidators", "type": "uint256" } ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "lastUpdateTimestamp", + "name": "hasVote", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "maintainer", - "outputs": [ + "inputs": [ { "internalType": "address", - "name": "", + "name": "_account", "type": "address" } ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "maintainerFee", + "name": "isAdmin", "outputs": [ { - "internalType": "uint256", + "internalType": "bool", "name": "", - "type": "uint256" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "rewardPerToken", + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isOracle", "outputs": [ { - "internalType": "uint128", + "internalType": "bool", "name": "", - "type": "uint128" + "type": "bool" } ], "stateMutability": "view", @@ -286,116 +435,145 @@ "inputs": [ { "internalType": "address", - "name": "_newMaintainer", + "name": "_account", "type": "address" } ], - "name": "setMaintainer", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ + "name": "isPauser", + "outputs": [ { - "internalType": "uint256", - "name": "_newMaintainerFee", - "type": "uint256" + "internalType": "bool", + "name": "", + "type": "bool" } ], - "name": "setMaintainerFee", + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], - "name": "totalRewards", + "name": "paused", "outputs": [ { - "internalType": "uint128", + "internalType": "bool", "name": "", - "type": "uint128" + "type": "bool" } ], "stateMutability": "view", "type": "function" }, { - "inputs": [], - "name": "totalSupply", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "address", + "name": "_account", + "type": "address" } ], - "stateMutability": "view", + "name": "removeAdmin", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", - "name": "recipient", + "name": "_account", "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" } ], - "name": "transfer", - "outputs": [ + "name": "removeOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { - "internalType": "bool", - "name": "", - "type": "bool" + "internalType": "address", + "name": "_account", + "type": "address" } ], + "name": "removePauser", + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, { "internalType": "address", - "name": "sender", + "name": "account", "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" }, { "internalType": "address", - "name": "recipient", + "name": "account", "type": "address" - }, + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ { "internalType": "uint256", - "name": "amount", + "name": "_syncPeriod", "type": "uint256" } ], - "name": "transferFrom", + "name": "setSyncPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "syncPeriod", "outputs": [ { - "internalType": "bool", + "internalType": "uint256", "name": "", - "type": "bool" + "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "updateRewardCheckpoint", + "inputs": [], + "name": "unpause", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -404,16 +582,11 @@ "inputs": [ { "internalType": "address", - "name": "account1", - "type": "address" - }, - { - "internalType": "address", - "name": "account2", + "name": "_pool", "type": "address" } ], - "name": "updateRewardCheckpoints", + "name": "upgrade", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -422,11 +595,16 @@ "inputs": [ { "internalType": "uint256", - "name": "newTotalRewards", + "name": "_totalRewards", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_activatedValidators", "type": "uint256" } ], - "name": "updateTotalRewards", + "name": "vote", "outputs": [], "stateMutability": "nonpayable", "type": "function" diff --git a/abi/Pool.json b/abi/Pool.json new file mode 100644 index 00000000..8da8c22c --- /dev/null +++ b/abi/Pool.json @@ -0,0 +1,823 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "validatorIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "Activated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "activatedValidators", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ActivatedValidatorsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "validatorIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "ActivationScheduled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "minActivatingDeposit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "MinActivatingDepositUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "pendingValidatorsLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "PendingValidatorsLimitUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "ValidatorRegistered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "withdrawalCredentials", + "type": "bytes32" + } + ], + "name": "WithdrawalCredentialsUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VALIDATOR_DEPOSIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_validatorIndex", + "type": "uint256" + } + ], + "name": "activate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + }, + { + "internalType": "uint256[]", + "name": "_validatorIndexes", + "type": "uint256[]" + } + ], + "name": "activateMultiple", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "activatedValidators", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "activations", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "addDeposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addPauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_validatorIndex", + "type": "uint256" + } + ], + "name": "canActivate", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isPauser", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "minActivatingDeposit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingValidators", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingValidatorsLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "depositDataRoot", + "type": "bytes32" + } + ], + "internalType": "struct IPool.Validator", + "name": "_validator", + "type": "tuple" + } + ], + "name": "registerValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removePauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newActivatedValidators", + "type": "uint256" + } + ], + "name": "setActivatedValidators", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minActivatingDeposit", + "type": "uint256" + } + ], + "name": "setMinActivatingDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pendingValidatorsLimit", + "type": "uint256" + } + ], + "name": "setPendingValidatorsLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_withdrawalCredentials", + "type": "bytes32" + } + ], + "name": "setWithdrawalCredentials", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_oracles", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_activatedValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_pendingValidators", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minActivatingDeposit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_pendingValidatorsLimit", + "type": "uint256" + } + ], + "name": "upgrade", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "validatorRegistration", + "outputs": [ + { + "internalType": "contract IDepositContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawalCredentials", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/abi/RewardEthToken.json b/abi/RewardEthToken.json new file mode 100644 index 00000000..8eb5e75f --- /dev/null +++ b/abi/RewardEthToken.json @@ -0,0 +1,980 @@ +[ + { + "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": "maintainerFee", + "type": "uint256" + } + ], + "name": "MaintainerFeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "maintainer", + "type": "address" + } + ], + "name": "MaintainerUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "periodRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalRewards", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rewardPerToken", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lastUpdateTimestamp", + "type": "uint256" + } + ], + "name": "RewardsUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "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" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addPauser", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "checkpoints", + "outputs": [ + { + "internalType": "uint128", + "name": "reward", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "rewardPerToken", + "type": "uint128" + } + ], + "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": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "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": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "_stakedEthToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_oracles", + "type": "address" + }, + { + "internalType": "address", + "name": "_maintainer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_maintainerFee", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isPauser", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUpdateTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maintainer", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maintainerFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removePauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "rewardPerToken", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newMaintainer", + "type": "address" + } + ], + "name": "setMaintainer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newMaintainerFee", + "type": "uint256" + } + ], + "name": "setMaintainerFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalRewards", + "outputs": [ + { + "internalType": "uint128", + "name": "", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "updateRewardCheckpoint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account1", + "type": "address" + }, + { + "internalType": "address", + "name": "account2", + "type": "address" + } + ], + "name": "updateRewardCheckpoints", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newTotalRewards", + "type": "uint256" + } + ], + "name": "updateTotalRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/abi/Solos.json b/abi/Solos.json new file mode 100644 index 00000000..83373346 --- /dev/null +++ b/abi/Solos.json @@ -0,0 +1,709 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "_validatorRegistration", + "type": "address" + }, + { + "internalType": "address", + "name": "_validators", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_validatorPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_cancelLockDuration", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "cancelLockDuration", + "type": "uint256" + } + ], + "name": "CancelLockDurationUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "soloId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "withdrawalCredentials", + "type": "bytes32" + } + ], + "name": "DepositAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "soloId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "withdrawalCredentials", + "type": "bytes32" + } + ], + "name": "DepositCanceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "validatorPrice", + "type": "uint256" + } + ], + "name": "ValidatorPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "soloId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "ValidatorRegistered", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VALIDATOR_DEPOSIT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_withdrawalCredentials", + "type": "bytes32" + } + ], + "name": "addDeposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addPauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_withdrawalCredentials", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "cancelDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "cancelLockDuration", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isPauser", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "publicKey", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "depositDataRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "soloId", + "type": "bytes32" + } + ], + "internalType": "struct ISolos.Validator", + "name": "_validator", + "type": "tuple" + } + ], + "name": "registerValidator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removePauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_cancelLockDuration", + "type": "uint256" + } + ], + "name": "setCancelLockDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_validatorPrice", + "type": "uint256" + } + ], + "name": "setValidatorPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "solos", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "withdrawalCredentials", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "releaseTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "validatorPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "validatorRegistration", + "outputs": [ + { + "internalType": "contract IDepositContract", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/abi/StakedEthToken.json b/abi/StakedEthToken.json new file mode 100644 index 00000000..7f885e6e --- /dev/null +++ b/abi/StakedEthToken.json @@ -0,0 +1,785 @@ +[ + { + "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": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "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" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addPauser", + "outputs": [], + "stateMutability": "nonpayable", + "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": "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": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "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": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "_rewardEthToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_pool", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isAdmin", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isPauser", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removePauser", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalDeposits", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/abi/OwnablePausableUpgradeable.json b/abi/Validators.json similarity index 77% rename from abi/OwnablePausableUpgradeable.json rename to abi/Validators.json index d0849a3f..134fc57b 100644 --- a/abi/OwnablePausableUpgradeable.json +++ b/abi/Validators.json @@ -113,6 +113,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "OPERATOR_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "PAUSER_ROLE", @@ -139,6 +152,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "addOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -256,6 +282,29 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_admin", + "type": "address" + }, + { + "internalType": "address", + "name": "_pool", + "type": "address" + }, + { + "internalType": "address", + "name": "_solos", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -275,6 +324,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "isOperator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -314,6 +382,38 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "publicKeys", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_validatorId", + "type": "bytes32" + } + ], + "name": "register", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -327,6 +427,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_account", + "type": "address" + } + ], + "name": "removeOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/contracts/Oracles.sol b/contracts/Oracles.sol index 545b43be..ded30c11 100644 --- a/contracts/Oracles.sol +++ b/contracts/Oracles.sol @@ -5,9 +5,9 @@ pragma solidity 0.7.5; import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; -import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol"; import "./presets/OwnablePausableUpgradeable.sol"; import "./interfaces/IRewardEthToken.sol"; +import "./interfaces/IPool.sol"; import "./interfaces/IOracles.sol"; /** @@ -22,13 +22,13 @@ contract Oracles is IOracles, ReentrancyGuardUpgradeable, OwnablePausableUpgrade bytes32 public constant ORACLE_ROLE = keccak256("ORACLE_ROLE"); - // @dev Defines the period for total rewards update. - uint256 public override totalRewardsUpdatePeriod; + // @dev Defines how often oracles submit data. + uint256 public override syncPeriod; // @dev Maps candidate ID to the number of votes it has. mapping(bytes32 => uint256) public override candidates; - // @dev List of supported rETH2 Uniswap pairs. + // @dev [Deprecated] List of supported rETH2 Uniswap pairs. address[] private rewardEthUniswapPairs; // @dev Maps vote ID to whether it was submitted or not. @@ -37,8 +37,11 @@ contract Oracles is IOracles, ReentrancyGuardUpgradeable, OwnablePausableUpgrade // @dev Address of the RewardEthToken contract. IRewardEthToken private rewardEthToken; - // @dev Nonce for RewardEthToken total rewards. - CountersUpgradeable.Counter private totalRewardsNonce; + // @dev Nonce is used to protect from submitting the same vote several times. + CountersUpgradeable.Counter private nonce; + + // @dev Address of the Pool contract. + IPool private pool; /** * @dev Modifier for checking whether the caller is an oracle. @@ -49,30 +52,34 @@ contract Oracles is IOracles, ReentrancyGuardUpgradeable, OwnablePausableUpgrade } /** - * @dev See {IOracles-initialize}. + * @dev See {IOracles-upgrade}. + * The `initialize` must be called before upgrading in previous implementation contract: + * https://github.com/stakewise/contracts/blob/v1.0.0/contracts/Oracles.sol#L54 */ - function initialize(address _admin, address _rewardEthToken, uint256 _totalRewardsUpdatePeriod) external override initializer { - __OwnablePausableUpgradeable_init(_admin); - __ReentrancyGuard_init_unchained(); - rewardEthToken = IRewardEthToken(_rewardEthToken); - - totalRewardsUpdatePeriod = _totalRewardsUpdatePeriod; - emit TotalRewardsUpdatePeriodUpdated(_totalRewardsUpdatePeriod); + function upgrade(address _pool) external override onlyAdmin whenPaused { + require(address(pool) == address(0), "Oracles: already upgraded"); + pool = IPool(_pool); } /** - * @dev See {IOracles-getRewardEthUniswapPairs}. + * @dev See {IOracles-hasVote}. */ - function getRewardEthUniswapPairs() public override view returns (address[] memory) { - return rewardEthUniswapPairs; + function hasVote( + address _oracle, + uint256 _totalRewards, + uint256 _activatedValidators + ) + external override view returns (bool) + { + bytes32 candidateId = keccak256(abi.encodePacked(nonce.current(), _totalRewards, _activatedValidators)); + return submittedVotes[keccak256(abi.encodePacked(_oracle, candidateId))]; } /** - * @dev See {IOracles-hasTotalRewardsVote}. + * @dev See {IOracles-currentNonce}. */ - function hasTotalRewardsVote(address _oracle, uint256 _totalRewards) external override view returns (bool) { - bytes32 candidateId = keccak256(abi.encodePacked(address(rewardEthToken), totalRewardsNonce.current(), _totalRewards)); - return submittedVotes[keccak256(abi.encodePacked(_oracle, candidateId))]; + function currentNonce() external override view returns (uint256) { + return nonce.current(); } /** @@ -97,27 +104,24 @@ contract Oracles is IOracles, ReentrancyGuardUpgradeable, OwnablePausableUpgrade } /** - * @dev See {IOracles-setRewardEthUniswapPairs}. + * @dev See {IOracles-setSyncPeriod}. */ - function setRewardEthUniswapPairs(address[] calldata _rewardEthUniswapPairs) external override onlyAdmin { - rewardEthUniswapPairs = _rewardEthUniswapPairs; - emit RewardEthUniswapPairsUpdated(_rewardEthUniswapPairs); + function setSyncPeriod(uint256 _syncPeriod) external override onlyAdmin { + syncPeriod = _syncPeriod; + emit SyncPeriodUpdated(_syncPeriod, msg.sender); } /** - * @dev See {IOracles-setTotalRewardsUpdatePeriod}. + * @dev See {IOracles-vote}. */ - function setTotalRewardsUpdatePeriod(uint256 _newTotalRewardsUpdatePeriod) external override onlyAdmin { - totalRewardsUpdatePeriod = _newTotalRewardsUpdatePeriod; - emit TotalRewardsUpdatePeriodUpdated(_newTotalRewardsUpdatePeriod); - } - - /** - * @dev See {IOracles-voteForTotalRewards}. - */ - function voteForTotalRewards(uint256 _newTotalRewards) external override onlyOracle whenNotPaused nonReentrant { - uint256 nonce = totalRewardsNonce.current(); - bytes32 candidateId = keccak256(abi.encodePacked(address(rewardEthToken), nonce, _newTotalRewards)); + function vote( + uint256 _totalRewards, + uint256 _activatedValidators + ) + external override onlyOracle whenNotPaused nonReentrant + { + uint256 _nonce = nonce.current(); + bytes32 candidateId = keccak256(abi.encodePacked(_nonce, _totalRewards, _activatedValidators)); bytes32 voteId = keccak256(abi.encodePacked(msg.sender, candidateId)); require(!submittedVotes[voteId], "Oracles: already voted"); @@ -125,17 +129,19 @@ contract Oracles is IOracles, ReentrancyGuardUpgradeable, OwnablePausableUpgrade submittedVotes[voteId] = true; uint256 candidateNewVotes = candidates[candidateId].add(1); candidates[candidateId] = candidateNewVotes; - emit TotalRewardsVoteSubmitted(msg.sender, nonce, _newTotalRewards); + emit VoteSubmitted(msg.sender, _nonce, _totalRewards, _activatedValidators); - // update rewards only if enough votes accumulated + // update only if enough votes accumulated if (candidateNewVotes.mul(3) > getRoleMemberCount(ORACLE_ROLE).mul(2)) { - totalRewardsNonce.increment(); + nonce.increment(); delete candidates[candidateId]; - rewardEthToken.updateTotalRewards(_newTotalRewards); - // force reserves to match balances - for (uint256 i = 0; i < rewardEthUniswapPairs.length; i++) { - IUniswapV2Pair(rewardEthUniswapPairs[i]).sync(); + // update total rewards + rewardEthToken.updateTotalRewards(_totalRewards); + + // update activated validators + if (_activatedValidators != pool.activatedValidators()) { + pool.setActivatedValidators(_activatedValidators); } } } diff --git a/contracts/collectors/Pool.sol b/contracts/collectors/Pool.sol index 1ab09349..a6e03b32 100644 --- a/contracts/collectors/Pool.sol +++ b/contracts/collectors/Pool.sol @@ -21,8 +21,8 @@ contract Pool is IPool, OwnablePausableUpgradeable { // @dev Validator deposit amount. uint256 public constant VALIDATOR_DEPOSIT = 32 ether; - // @dev Total amount collected. - uint256 public override collectedAmount; + // @dev Total activated validators. + uint256 public override activatedValidators; // @dev Pool validator withdrawal credentials. bytes32 public override withdrawalCredentials; @@ -36,26 +36,47 @@ contract Pool is IPool, OwnablePausableUpgradeable { // @dev Address of the Validators contract. IValidators private validators; + // @dev Address of the Oracles contract. + address private oracles; + + // @dev Maps senders to the validator index that it will be activated in. + mapping(address => mapping(uint256 => uint256)) public override activations; + + // @dev Total pending validators. + uint256 public override pendingValidators; + + // @dev Amount of deposited ETH that is not considered for the activation period. + uint256 public override minActivatingDeposit; + + // @dev Pending validators percent limit. If it's not exceeded tokens can be minted immediately. + uint256 public override pendingValidatorsLimit; + /** - * @dev See {IPool-initialize}. + * @dev See {IPool-upgrade}. + * The `initialize` must be called before upgrading in previous implementation contract: + * https://github.com/stakewise/contracts/blob/v1.0.0/contracts/collectors/Pool.sol#L42 */ - function initialize( - address _admin, - address _stakedEthToken, - address _validatorRegistration, - address _validators, - bytes32 _withdrawalCredentials + function upgrade( + address _oracles, + uint256 _activatedValidators, + uint256 _pendingValidators, + uint256 _minActivatingDeposit, + uint256 _pendingValidatorsLimit ) - external override initializer + external override onlyAdmin whenPaused { - __OwnablePausableUpgradeable_init(_admin); - stakedEthToken = IStakedEthToken(_stakedEthToken); - validatorRegistration = IDepositContract(_validatorRegistration); - validators = IValidators(_validators); + require(oracles == address(0), "Pool: already upgraded"); + oracles = _oracles; - // set withdrawal credentials - withdrawalCredentials = _withdrawalCredentials; - emit WithdrawalCredentialsUpdated(_withdrawalCredentials); + pendingValidators = _pendingValidators; + activatedValidators = _activatedValidators; + emit ActivatedValidatorsUpdated(_activatedValidators, msg.sender); + + minActivatingDeposit = _minActivatingDeposit; + emit MinActivatingDepositUpdated(_minActivatingDeposit, msg.sender); + + pendingValidatorsLimit = _pendingValidatorsLimit; + emit PendingValidatorsLimitUpdated(_pendingValidatorsLimit, msg.sender); } /** @@ -66,17 +87,99 @@ contract Pool is IPool, OwnablePausableUpgradeable { emit WithdrawalCredentialsUpdated(_withdrawalCredentials); } + /** + * @dev See {IPool-setMinActivatingDeposit}. + */ + function setMinActivatingDeposit(uint256 _minActivatingDeposit) external override onlyAdmin { + minActivatingDeposit = _minActivatingDeposit; + emit MinActivatingDepositUpdated(_minActivatingDeposit, msg.sender); + } + + /** + * @dev See {IPool-setPendingValidatorsLimit}. + */ + function setPendingValidatorsLimit(uint256 _pendingValidatorsLimit) external override onlyAdmin { + require(_pendingValidatorsLimit < 10000, "Pool: invalid limit"); + pendingValidatorsLimit = _pendingValidatorsLimit; + emit PendingValidatorsLimitUpdated(_pendingValidatorsLimit, msg.sender); + } + + /** + * @dev See {IPool-setActivatedValidators}. + */ + function setActivatedValidators(uint256 newActivatedValidators) external override { + require(msg.sender == oracles || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "Pool: access denied"); + + // subtract activated validators from pending validators + pendingValidators = pendingValidators.sub(newActivatedValidators.sub(activatedValidators)); + activatedValidators = newActivatedValidators; + emit ActivatedValidatorsUpdated(newActivatedValidators, msg.sender); + } + /** * @dev See {IPool-addDeposit}. */ function addDeposit() external payable override whenNotPaused { require(msg.value > 0, "Pool: invalid deposit amount"); - // update pool collected amount - collectedAmount = collectedAmount.add(msg.value); + // mint tokens for small deposits immediately + if (msg.value <= minActivatingDeposit) { + stakedEthToken.mint(msg.sender, msg.value); + return; + } + + // mint tokens if current pending validators limit is not exceed + uint256 _pendingValidators = pendingValidators.add((address(this).balance).div(VALIDATOR_DEPOSIT)); + uint256 _activatedValidators = activatedValidators; // gas savings + uint256 validatorIndex = _activatedValidators.add(_pendingValidators); + if (validatorIndex.mul(1e4) <= _activatedValidators.mul(pendingValidatorsLimit.add(1e4))) { + stakedEthToken.mint(msg.sender, msg.value); + } else { + // lock deposit amount until validator activated + activations[msg.sender][validatorIndex] = activations[msg.sender][validatorIndex].add(msg.value); + emit ActivationScheduled(msg.sender, validatorIndex, msg.value); + } + } + + /** + * @dev See {IPool-canActivate}. + */ + function canActivate(uint256 _validatorIndex) external view override returns (bool) { + return _validatorIndex.mul(1e4) <= activatedValidators.mul(pendingValidatorsLimit.add(1e4)); + } + + /** + * @dev See {IPool-activate}. + */ + function activate(address _account, uint256 _validatorIndex) external override whenNotPaused { + require(_validatorIndex.mul(1e4) <= activatedValidators.mul(pendingValidatorsLimit.add(1e4)), "Pool: validator is not active yet"); + + uint256 amount = activations[_account][_validatorIndex]; + require(amount > 0, "Pool: invalid validator index"); - // mint new staked tokens - stakedEthToken.mint(msg.sender, msg.value); + delete activations[_account][_validatorIndex]; + stakedEthToken.mint(_account, amount); + emit Activated(_account, _validatorIndex, amount, msg.sender); + } + + /** + * @dev See {IPool-activateMultiple}. + */ + function activateMultiple(address _account, uint256[] calldata _validatorIndexes) external override whenNotPaused { + uint256 toMint; + uint256 _activatedValidators = activatedValidators; + for (uint256 i = 0; i < _validatorIndexes.length; i++) { + uint256 validatorIndex = _validatorIndexes[i]; + require(validatorIndex.mul(1e4) <= _activatedValidators.mul(pendingValidatorsLimit.add(1e4)), "Pool: validator is not active yet"); + + uint256 amount = activations[_account][validatorIndex]; + toMint = toMint.add(amount); + delete activations[_account][validatorIndex]; + + emit Activated(_account, validatorIndex, amount, msg.sender); + } + require(toMint > 0, "Pool: invalid validator index"); + stakedEthToken.mint(_account, toMint); } /** @@ -85,13 +188,13 @@ contract Pool is IPool, OwnablePausableUpgradeable { function registerValidator(Validator calldata _validator) external override whenNotPaused { require(validators.isOperator(msg.sender), "Pool: access denied"); - // reduce pool collected amount - collectedAmount = collectedAmount.sub(VALIDATOR_DEPOSIT, "Pool: insufficient amount"); - // register validator validators.register(keccak256(abi.encodePacked(_validator.publicKey))); emit ValidatorRegistered(_validator.publicKey, msg.sender); + // update number of pending validators + pendingValidators = pendingValidators.add(1); + validatorRegistration.deposit{value : VALIDATOR_DEPOSIT}( _validator.publicKey, abi.encodePacked(withdrawalCredentials), diff --git a/contracts/interfaces/IOracles.sol b/contracts/interfaces/IOracles.sol index 2e508a21..83e56fd6 100644 --- a/contracts/interfaces/IOracles.sol +++ b/contracts/interfaces/IOracles.sol @@ -7,48 +7,42 @@ pragma solidity 0.7.5; */ interface IOracles { /** - * @dev Event for tracking votes for RewardEthToken total rewards. + * @dev Event for tracking oracle votes. * @param oracle - address of the account which submitted vote. * @param nonce - update nonce. * @param totalRewards - submitted value of total rewards. + * @param activatedValidators - voted amount of activated validators. */ - event TotalRewardsVoteSubmitted(address indexed oracle, uint256 nonce, uint256 totalRewards); + event VoteSubmitted( + address indexed oracle, + uint256 nonce, + uint256 totalRewards, + uint256 activatedValidators + ); /** - * @dev Event for tracking RewardEthToken total rewards update preiod changes. - * @param totalRewardsUpdatePeriod - new total rewards update period. + * @dev Event for tracking changes of oracles' sync periods. + * @param syncPeriod - new sync period. + * @param sender - address of the transaction sender. */ - event TotalRewardsUpdatePeriodUpdated(uint256 totalRewardsUpdatePeriod); + event SyncPeriodUpdated(uint256 syncPeriod, address indexed sender); /** - * @dev Event for tracking updated reward ETH uniswap pairs. - * @param rewardEthUniswapPairs - new list of supported uniswap pairs. - */ - event RewardEthUniswapPairsUpdated(address[] rewardEthUniswapPairs); - - /** - * @dev Function for retrieving number of votes for the rewards update candidate. + * @dev Function for retrieving number of votes of the submission candidate. * @param _candidateId - ID of the candidate to retrieve number of votes for. */ function candidates(bytes32 _candidateId) external view returns (uint256); /** - * @dev Function for retrieving total rewards update period. + * @dev Function for retrieving oracles sync period. */ - function totalRewardsUpdatePeriod() external view returns (uint256); + function syncPeriod() external view returns (uint256); /** - * @dev Function for retrieving supported reward ETH uniswap pairs. + * @dev Function for upgrading the Oracles contract. + * @param _pool - address of the Pool contract. */ - function getRewardEthUniswapPairs() external view returns (address[] memory); - - /** - * @dev Constructor for initializing the Oracles contract. - * @param _admin - address of the contract admin. - * @param _rewardEthToken - address of the RewardEthToken contract. - * @param _totalRewardsUpdatePeriod - total rewards update period. - */ - function initialize(address _admin, address _rewardEthToken, uint256 _totalRewardsUpdatePeriod) external; + function upgrade(address _pool) external; /** * @dev Function for checking whether an account has an oracle role. @@ -57,11 +51,21 @@ interface IOracles { function isOracle(address _account) external view returns (bool); /** - * @dev Function for checking whether an account has voted for the total rewards. + * @dev Function for checking whether an oracle has voted. * @param _oracle - oracle address to check. - * @param _totalRewards - total rewards submitted by the oracle. + * @param _totalRewards - voted total rewards. + * @param _activatedValidators - voted amount of activated validators. */ - function hasTotalRewardsVote(address _oracle, uint256 _totalRewards) external view returns (bool); + function hasVote( + address _oracle, + uint256 _totalRewards, + uint256 _activatedValidators + ) external view returns (bool); + + /** + * @dev Function for retrieving current nonce. + */ + function currentNonce() external view returns (uint256); /** * @dev Function for adding an oracle role to the account. @@ -78,23 +82,17 @@ interface IOracles { function removeOracle(address _account) external; /** - * @dev Function for updating list of supported reward ETH uniswap pairs. - * Can only be called by an account with an admin role. - * @param _rewardEthUniswapPairs - list of supported uniswap pairs. - */ - function setRewardEthUniswapPairs(address[] calldata _rewardEthUniswapPairs) external; - - /** - * @dev Function for updating total rewards update period. + * @dev Function for updating oracles sync period. The number of seconds after they will submit the off-chain data. * Can only be called by an account with an admin role. - * @param _newTotalRewardsUpdatePeriod - new total rewards. + * @param _syncPeriod - new sync period. */ - function setTotalRewardsUpdatePeriod(uint256 _newTotalRewardsUpdatePeriod) external; + function setSyncPeriod(uint256 _syncPeriod) external; /** - * @dev Function for voting for new RewardEthToken total rewards. + * @dev Function for submitting oracle vote. The last vote required for quorum will update the values. * Can only be called by an account with an oracle role. - * @param _newTotalRewards - total rewards to give a vote for. + * @param _totalRewards - voted total rewards. + * @param _activatedValidators - voted amount of activated validators. */ - function voteForTotalRewards(uint256 _newTotalRewards) external; + function vote(uint256 _totalRewards, uint256 _activatedValidators) external; } diff --git a/contracts/interfaces/IPool.sol b/contracts/interfaces/IPool.sol index 4a9f2da0..4e1c878e 100644 --- a/contracts/interfaces/IPool.sol +++ b/contracts/interfaces/IPool.sol @@ -22,6 +22,45 @@ interface IPool { */ event ValidatorRegistered(bytes publicKey, address operator); + /** + * @dev Event for tracking scheduled deposit activation. + * @param sender - address of the deposit sender. + * @param validatorIndex - index of the activated validator. + * @param value - deposit amount to be activated. + */ + event ActivationScheduled(address indexed sender, uint256 validatorIndex, uint256 value); + + /** + * @dev Event for tracking activated deposits. + * @param account - account the deposit was activated for. + * @param validatorIndex - index of the activated validator. + * @param value - amount activated. + * @param sender - address of the transaction sender. + */ + event Activated(address indexed account, uint256 validatorIndex, uint256 value, address indexed sender); + + /** + * @dev Event for tracking activated validators updates. + * @param activatedValidators - new total amount of activated validators. + * @param sender - address of the transaction sender. + */ + event ActivatedValidatorsUpdated(uint256 activatedValidators, address sender); + + /** + * @dev Event for tracking updates to the minimal deposit amount considered for the activation period. + * @param minActivatingDeposit - new minimal deposit amount considered for the activation. + * @param sender - address of the transaction sender. + */ + event MinActivatingDepositUpdated(uint256 minActivatingDeposit, address sender); + + /** + * @dev Event for tracking pending validators limit. + * When it's exceeded, the deposits will be set for the activation. + * @param pendingValidatorsLimit - pending validators percent limit. + * @param sender - address of the transaction sender. + */ + event PendingValidatorsLimitUpdated(uint256 pendingValidatorsLimit, address sender); + /** * @dev Structure for passing information about new Validator. * @param publicKey - BLS public key of the validator, generated by the operator. @@ -35,25 +74,30 @@ interface IPool { } /** - * @dev Constructor for initializing the Pool contract. - * @param _admin - address of the contract admin. - * @param _stakedEthToken - address of the StakedEthToken contract. - * @param _validatorRegistration - address of the VRC (deployed by Ethereum). - * @param _validators - address of the Validators contract. - * @param _withdrawalCredentials - withdrawal credentials for the pool validators. + * @dev Function for upgrading the Pools contract. + * @param _oracles - address of the Oracles contract. + * @param _activatedValidators - initial amount of activated validators. + * @param _pendingValidators - initial amount of pending validators. + * @param _minActivatingDeposit - minimal deposit in Wei to be considered for the activation period. + * @param _pendingValidatorsLimit - pending validators percent limit. If it's not exceeded tokens can be minted immediately. */ - function initialize( - address _admin, - address _stakedEthToken, - address _validatorRegistration, - address _validators, - bytes32 _withdrawalCredentials + function upgrade( + address _oracles, + uint256 _activatedValidators, + uint256 _pendingValidators, + uint256 _minActivatingDeposit, + uint256 _pendingValidatorsLimit ) external; /** - * @dev Function for retrieving the total collected amount. + * @dev Function for getting the total amount of pending validators. + */ + function pendingValidators() external view returns (uint256); + + /** + * @dev Function for retrieving the total amount of activated validators. */ - function collectedAmount() external view returns (uint256); + function activatedValidators() external view returns (uint256); /** * @dev Function for getting the withdrawal credentials used to @@ -61,12 +105,54 @@ interface IPool { */ function withdrawalCredentials() external view returns (bytes32); + /** + * @dev Function for getting the minimal deposit amount considered for the activation. + */ + function minActivatingDeposit() external view returns (uint256); + + /** + * @dev Function for getting the pending validators percent limit. + * When it's exceeded, the deposits will be set for the activation. + */ + function pendingValidatorsLimit() external view returns (uint256); + + /** + * @dev Function for getting the amount of activating deposits. + * @param account - address of the account to get the amount for. + * @param validatorIndex - index of the activated validator. + */ + function activations(address account, uint256 validatorIndex) external view returns (uint256); + + /** + * @dev Function for setting minimal deposit amount considered for the activation period. + * @param _minActivatingDeposit - new minimal deposit amount considered for the activation. + */ + function setMinActivatingDeposit(uint256 _minActivatingDeposit) external; + /** * @dev Function for changing withdrawal credentials. * @param _withdrawalCredentials - new withdrawal credentials for the pool validators. */ function setWithdrawalCredentials(bytes32 _withdrawalCredentials) external; + /** + * @dev Function for changing the total amount of activated validators. + * @param _activatedValidators - new total amount of activated validators. + */ + function setActivatedValidators(uint256 _activatedValidators) external; + + /** + * @dev Function for changing pending validators limit. + * @param _pendingValidatorsLimit - new pending validators limit. When it's exceeded, the deposits will be set for the activation. + */ + function setPendingValidatorsLimit(uint256 _pendingValidatorsLimit) external; + + /** + * @dev Function for checking whether validator index can be activated. + * @param _validatorIndex - index of the validator to check. + */ + function canActivate(uint256 _validatorIndex) external view returns (bool); + /** * @dev Function for retrieving the validator registration contract address. */ @@ -77,6 +163,20 @@ interface IPool { */ function addDeposit() external payable; + /** + * @dev Function for minting account's tokens for the specific validator index. + * @param _account - account address to activate the tokens for. + * @param _validatorIndex - index of the activated validator. + */ + function activate(address _account, uint256 _validatorIndex) external; + + /** + * @dev Function for minting account's tokens for the specific validator indexes. + * @param _account - account address to activate the tokens for. + * @param _validatorIndexes - list of activated validator indexes. + */ + function activateMultiple(address _account, uint256[] calldata _validatorIndexes) external; + /** * @dev Function for registering new pool validator. * @param _validator - validator to register. diff --git a/deployments/collectors.js b/deployments/collectors.js index 2ae89b43..6d2c0e15 100644 --- a/deployments/collectors.js +++ b/deployments/collectors.js @@ -1,73 +1,43 @@ -const { ethers, upgrades, network } = require('hardhat'); -const { calculateGasMargin } = require('./utils'); -const { initialSettings } = require('./settings'); +const hre = require('hardhat'); +const { + getProxyAdminFactory, +} = require('@openzeppelin/hardhat-upgrades/dist/proxy-factory'); -let provider = new ethers.providers.Web3Provider(network.provider); - -async function deployPool() { - const Pool = await ethers.getContractFactory('Pool'); - const proxy = await upgrades.deployProxy(Pool, [], { - initializer: false, - unsafeAllowCustomTypes: true, - }); - await proxy.deployed(); - return proxy.address; -} - -async function initializePool( - poolContractAddress, - adminAddress, - stakedEthTokenContractAddress, - vrcContractAddress, - validatorsContractAddress +async function preparePoolUpgradeData( + oraclesContractAddress, + activatedValidators, + pendingValidators, + minActivatingDeposit, + pendingValidatorsLimit ) { - let Pool = await ethers.getContractFactory('Pool'); - Pool = Pool.attach(poolContractAddress); - - const { hash } = await Pool.estimateGas - .initialize( - adminAddress, - stakedEthTokenContractAddress, - vrcContractAddress, - validatorsContractAddress, - initialSettings.withdrawalCredentials - ) - .then((estimatedGas) => - Pool.initialize( - adminAddress, - stakedEthTokenContractAddress, - vrcContractAddress, - validatorsContractAddress, - initialSettings.withdrawalCredentials, - { - gasLimit: calculateGasMargin(estimatedGas), - } - ) - ); - return provider.waitForTransaction(hash); + const Pool = await hre.ethers.getContractFactory('Pool'); + return Pool.interface.encodeFunctionData('upgrade', [ + oraclesContractAddress, + activatedValidators, + pendingValidators, + minActivatingDeposit, + pendingValidatorsLimit, + ]); } -async function deploySolos( +async function upgradePool( adminAddress, - vrcContractAddress, - validatorsContractAddress + proxyAdminContractAddress, + poolContractAddress, + nextImplementation, + data ) { - // Solos is deployed without proxy as it's non-custodial - const Solos = await ethers.getContractFactory('Solos'); - const solos = await Solos.deploy( - adminAddress, - vrcContractAddress, - validatorsContractAddress, - initialSettings.validatorPrice, - initialSettings.cancelLockDuration - ); + const signer = await hre.ethers.provider.getSigner(adminAddress); + const AdminFactory = await getProxyAdminFactory(hre); + const proxyAdmin = AdminFactory.attach(proxyAdminContractAddress); - await solos.deployed(); - return solos.address; + const proxy = await proxyAdmin + .connect(signer) + .upgradeAndCall(poolContractAddress, nextImplementation, data); + return proxy.address; } module.exports = { - deployPool, - initializePool, - deploySolos, + upgradePool, + preparePoolUpgradeData, }; diff --git a/deployments/index.js b/deployments/index.js index 4c65c7e9..e5e18f79 100644 --- a/deployments/index.js +++ b/deployments/index.js @@ -1,23 +1,9 @@ const hre = require('hardhat'); -const { - getManifestAdmin, -} = require('@openzeppelin/hardhat-upgrades/dist/admin.js'); const { white, green } = require('chalk'); -const { initialSettings } = require('./settings'); - -const { - deployValidators, - initializeValidators, - deployOracles, - initializeOracles, -} = require('./validators'); -const { deploySolos, deployPool, initializePool } = require('./collectors'); -const { - deployRewardEthToken, - deployStakedEthToken, - initializeRewardEthToken, - initializeStakedEthToken, -} = require('./tokens'); +const { contractSettings, contracts } = require('./settings'); +const { prepareOraclesUpgradeData, upgradeOracles } = require('./validators'); +const { preparePoolUpgradeData, upgradePool } = require('./collectors'); +const { prepareUpgrade } = require('./utils'); function log(message) { if (hre.config != null && hre.config.suppressLogs !== true) { @@ -25,122 +11,83 @@ function log(message) { } } -function delay(ms) { - return new Promise((res) => setTimeout(res, ms)); -} - -async function deployAllContracts({ - initialAdmin = initialSettings.admin, - vrcContractAddress = initialSettings.VRC, - transferProxyAdminOwnership = false, -} = {}) { - // Deploy contracts - const validatorsContractAddress = await deployValidators(); +async function prepareContractsUpgrades() { + const Pool = await hre.ethers.getContractFactory('Pool'); + const poolImplementation = await prepareUpgrade(Pool, contracts.pool); log( - white(`Deployed Validators contract: ${green(validatorsContractAddress)}`) + white(`Deployed Pool implementation contract: ${green(poolImplementation)}`) ); - const poolContractAddress = await deployPool(); - log(white(`Deployed Pool contract: ${green(poolContractAddress)}`)); - - const solosContractAddress = await deploySolos( - initialAdmin, - vrcContractAddress, - validatorsContractAddress + const poolUpgradeData = await preparePoolUpgradeData( + contracts.oracles, + contractSettings.activatedValidators, + contractSettings.pendingValidators, + contractSettings.minActivatingDeposit, + contractSettings.pendingValidatorsLimit ); - log(white(`Deployed Solos contract: ${green(solosContractAddress)}`)); + log(white(`Pool upgrade data: ${green(poolUpgradeData)}`)); - const stakedEthTokenContractAddress = await deployStakedEthToken(); - log( - white( - `Deployed StakedEthToken contract: ${green( - stakedEthTokenContractAddress - )}` - ) + const Oracles = await hre.ethers.getContractFactory('Oracles'); + const oraclesImplementation = await prepareUpgrade( + Oracles, + contracts.oracles ); - - const rewardEthTokenContractAddress = await deployRewardEthToken(); log( white( - `Deployed RewardEthToken contract: ${green( - rewardEthTokenContractAddress + `Deployed Oracles implementation contract: ${green( + oraclesImplementation )}` ) ); - const oraclesContractAddress = await deployOracles(); - log(white(`Deployed Oracles contract: ${green(oraclesContractAddress)}`)); - - // Initialize contracts - await initializeValidators( - validatorsContractAddress, - initialAdmin, - poolContractAddress, - solosContractAddress - ); - log(white('Initialized Validators contract')); - - await initializePool( - poolContractAddress, - initialAdmin, - stakedEthTokenContractAddress, - vrcContractAddress, - validatorsContractAddress - ); - log(white('Initialized Pool contract')); + const oraclesUpgradeData = await prepareOraclesUpgradeData(contracts.pool); + log(white(`Oracles upgrade data: ${green(oraclesUpgradeData)}`)); - await initializeStakedEthToken( - stakedEthTokenContractAddress, - initialAdmin, - rewardEthTokenContractAddress, - poolContractAddress - ); - log(white('Initialized StakedEthToken contract')); + return { + poolImplementation, + poolUpgradeData, + oraclesImplementation, + oraclesUpgradeData, + }; +} - await initializeRewardEthToken( - rewardEthTokenContractAddress, - initialAdmin, - stakedEthTokenContractAddress, - oraclesContractAddress +async function upgradeContracts() { + let preparedUpgrades = await prepareContractsUpgrades(); + const signer = await hre.ethers.provider.getSigner(contractSettings.admin); + + const Pool = await hre.ethers.getContractFactory('Pool'); + let pool = Pool.attach(contracts.pool); + await pool.connect(signer).pause(); + await pool.connect(signer).addAdmin(contracts.proxyAdmin); + + const Oracles = await hre.ethers.getContractFactory('Oracles'); + let oracles = Oracles.attach(contracts.oracles); + await oracles.connect(signer).pause(); + await oracles.connect(signer).addAdmin(contracts.proxyAdmin); + + await upgradePool( + contractSettings.admin, + contracts.proxyAdmin, + contracts.pool, + preparedUpgrades.poolImplementation, + preparedUpgrades.poolUpgradeData ); - log(white('Initialized RewardEthToken contract')); - - await initializeOracles( - oraclesContractAddress, - initialAdmin, - rewardEthTokenContractAddress, - initialSettings.totalRewardsUpdatePeriod + log(white('Upgraded Pool contract')); + + await upgradeOracles( + contractSettings.admin, + contracts.proxyAdmin, + contracts.oracles, + preparedUpgrades.oraclesImplementation, + preparedUpgrades.oraclesUpgradeData ); - log(white('Initialized Oracles contract')); - - if (transferProxyAdminOwnership) { - const admin = await getManifestAdmin(hre); - await hre.upgrades.admin.transferProxyAdminOwnership(initialAdmin); - let newOwner = await admin.owner(); - for (let i = 0; i < 10; i++) { - if (newOwner === initialAdmin) { - log(white(`Transferred proxy admin ownership to ${newOwner}`)); - return; - } - await delay(5000); - newOwner = await admin.owner(); - } - throw Error( - `Failed to transfer proxy admin ownership: expected=${initialAdmin}, - actual=${newOwner}` - ); - } + log(white('Upgraded Oracles contract')); - return { - validators: validatorsContractAddress, - oracles: oraclesContractAddress, - pool: poolContractAddress, - solos: solosContractAddress, - stakedEthToken: stakedEthTokenContractAddress, - rewardEthToken: rewardEthTokenContractAddress, - }; + await pool.connect(signer).unpause(); + await oracles.connect(signer).unpause(); } module.exports = { - deployAllContracts, + prepareContractsUpgrades, + upgradeContracts, }; diff --git a/deployments/settings.js b/deployments/settings.js index 8cc05821..90d27af2 100644 --- a/deployments/settings.js +++ b/deployments/settings.js @@ -1,15 +1,60 @@ -const initialSettings = { - cancelLockDuration: '86400', // 1 day - totalRewardsUpdatePeriod: '86400', // 1 day - validatorPrice: '10000000000000000000', // 10 DAI / month - maintainerFee: '1000', // 10%, - admin: '0x144a98cb1CdBb23610501fE6108858D9B7D24934', - maintainer: '0xf91AA4a655B6F43243ed4C2853F3508314DaA2aB', - VRC: '0x00000000219ab540356cbb839cbe05303d7705fa', - withdrawalCredentials: - '0x003e294ffc37978496f1b9298d5984ad4d55d4e2d1e6a06ee6904810c7b9e0d5', -}; +const hre = require('hardhat'); + +let contracts, contractSettings; +if (hre.hardhatArguments && hre.hardhatArguments.network === 'goerli') { + contracts = { + validators: '0xE2F13059454b626e42e04845815E9Ed2E9774bF3', + oracles: '0xE54486fa4eB45716c5725d7A46FDDe810B8E8914', + pool: '0x8c1EfEcFb5c4F1099AB0460b5659342943764Df7', + solos: '0xcf809A020EE599034C010b387F2116237a5B22Bc', + stakedEthToken: '0x221D9812823DBAb0F1fB40b0D294D9875980Ac19', + rewardEthToken: '0x826f88d423440c305D9096cC1581Ae751eFCAfB0', + proxyAdmin: '0xbba3f4dDD4F705aD2028ee2da64fF3166bDe8cA8', + }; + contractSettings = { + cancelLockDuration: '86400', // 1 day + oraclesSyncPeriod: '86400', // 1 day + validatorPrice: '10000000000000000000', // 10 DAI / month + maintainerFee: '1000', // 10%, + admin: '0x1867c96601bc5fE24F685d112314B8F3Fe228D5A', + maintainer: '0x1867c96601bc5fE24F685d112314B8F3Fe228D5A', + VRC: '0x8c5fecdC472E27Bc447696F431E425D02dd46a8c', + withdrawalCredentials: + '0x003e294ffc37978496f1b9298d5984ad4d55d4e2d1e6a06ee6904810c7b9e0d5', + activatedValidators: '0', + pendingValidators: '1', + minActivatingDeposit: '5000000000000000000', // 5 ETH + pendingValidatorsLimit: '500', // 5 % + }; +} else { + contractSettings = { + cancelLockDuration: '86400', // 1 day + oraclesSyncPeriod: '86400', // 1 day + validatorPrice: '10000000000000000000', // 10 DAI / month + maintainerFee: '1000', // 10%, + admin: '0x144a98cb1CdBb23610501fE6108858D9B7D24934', + maintainer: '0xf91AA4a655B6F43243ed4C2853F3508314DaA2aB', + VRC: '0x00000000219ab540356cbb839cbe05303d7705fa', + withdrawalCredentials: + '0x003e294ffc37978496f1b9298d5984ad4d55d4e2d1e6a06ee6904810c7b9e0d5', + activatedValidators: '530', + pendingValidators: '2', + minActivatingDeposit: '32000000000000000000', // 32 ETH + pendingValidatorsLimit: '500', // 5 % + }; + + contracts = { + validators: '0xaAc73D4A26Ae6906aa115118b7840b1F19fcd3A5', + oracles: '0x2f1C5E86B13a74f5A6E7B4b35DD77fe29Aa47514', + pool: '0xC874b064f465bdD6411D45734b56fac750Cda29A', + solos: '0xEadCBA8BF9ACA93F627F31fB05470F5A0686CEca', + stakedEthToken: '0xFe2e637202056d30016725477c5da089Ab0A043A', + rewardEthToken: '0x20BC832ca081b91433ff6c17f85701B6e92486c5', + proxyAdmin: '0x3EB0175dcD67d3AB139aA03165e24AA2188A4C22', + }; +} module.exports = { - initialSettings, + contractSettings, + contracts, }; diff --git a/deployments/tokens.js b/deployments/tokens.js index b1a9a0a0..150c10c0 100644 --- a/deployments/tokens.js +++ b/deployments/tokens.js @@ -1,8 +1,4 @@ -const { ethers, upgrades, network } = require('hardhat'); -const { calculateGasMargin } = require('./utils'); -const { initialSettings } = require('./settings'); - -let provider = new ethers.providers.Web3Provider(network.provider); +const { ethers } = require('hardhat'); async function deployAndInitializeERC20Mock( ownerAddress, @@ -16,90 +12,6 @@ async function deployAndInitializeERC20Mock( return erc20Mock.address; } -async function deployStakedEthToken() { - const StakedEthToken = await ethers.getContractFactory('StakedEthToken'); - const proxy = await upgrades.deployProxy(StakedEthToken, [], { - initializer: false, - unsafeAllowCustomTypes: true, - }); - await proxy.deployed(); - return proxy.address; -} - -async function initializeStakedEthToken( - stakedEthTokenContractAddress, - adminAddress, - rewardEthTokenContractAddress, - poolContractAddress -) { - let StakedEthToken = await ethers.getContractFactory('StakedEthToken'); - StakedEthToken = StakedEthToken.attach(stakedEthTokenContractAddress); - - const { hash } = await StakedEthToken.estimateGas - .initialize( - adminAddress, - rewardEthTokenContractAddress, - poolContractAddress - ) - .then((estimatedGas) => - StakedEthToken.initialize( - adminAddress, - rewardEthTokenContractAddress, - poolContractAddress, - { - gasLimit: calculateGasMargin(estimatedGas), - } - ) - ); - return provider.waitForTransaction(hash); -} - -async function deployRewardEthToken() { - const RewardEthToken = await ethers.getContractFactory('RewardEthToken'); - const proxy = await upgrades.deployProxy(RewardEthToken, [], { - initializer: false, - unsafeAllowCustomTypes: true, - }); - await proxy.deployed(); - return proxy.address; -} - -async function initializeRewardEthToken( - rewardEthTokenContractAddress, - adminAddress, - stakedEthTokenContractAddress, - oraclesContractAddress -) { - let RewardEthToken = await ethers.getContractFactory('RewardEthToken'); - RewardEthToken = RewardEthToken.attach(rewardEthTokenContractAddress); - - const { hash } = await RewardEthToken.estimateGas - .initialize( - adminAddress, - stakedEthTokenContractAddress, - oraclesContractAddress, - initialSettings.maintainer, - initialSettings.maintainerFee - ) - .then((estimatedGas) => - RewardEthToken.initialize( - adminAddress, - stakedEthTokenContractAddress, - oraclesContractAddress, - initialSettings.maintainer, - initialSettings.maintainerFee, - { - gasLimit: calculateGasMargin(estimatedGas), - } - ) - ); - return provider.waitForTransaction(hash); -} - module.exports = { deployAndInitializeERC20Mock, - deployStakedEthToken, - initializeStakedEthToken, - deployRewardEthToken, - initializeRewardEthToken, }; diff --git a/deployments/utils.js b/deployments/utils.js index 5399d096..8d43fb40 100644 --- a/deployments/utils.js +++ b/deployments/utils.js @@ -1,4 +1,19 @@ +const hre = require('hardhat'); const { BigNumber } = require('ethers'); +const { deploy } = require('@openzeppelin/hardhat-upgrades/dist/utils/deploy'); +const { + readValidations, +} = require('@openzeppelin/hardhat-upgrades/dist/validations'); +const { + assertUpgradeSafe, + fetchOrDeploy, + getStorageLayout, + getStorageLayoutForAddress, + getImplementationAddress, + getVersion, + getUnlinkedBytecode, + Manifest, +} = require('@openzeppelin/upgrades-core'); function calculateGasMargin(value) { return value @@ -7,6 +22,34 @@ function calculateGasMargin(value) { .div(BigNumber.from(10000)); } +// overrides: https://github.com/OpenZeppelin/openzeppelin-upgrades/blob/%40openzeppelin/hardhat-upgrades%401.6.0/packages/plugin-hardhat/src/upgrade-proxy.ts#L34 +async function prepareUpgrade(contract, contractAddress) { + const { provider } = hre.network; + const manifest = await Manifest.forNetwork(provider); + + const validations = await readValidations(hre); + + const unlinkedBytecode = getUnlinkedBytecode(validations, contract.bytecode); + const version = getVersion(unlinkedBytecode, contract.bytecode); + assertUpgradeSafe(validations, version, {}); + + const currentImplAddress = await getImplementationAddress( + provider, + contractAddress + ); + await getStorageLayoutForAddress(manifest, validations, currentImplAddress); + const layout = getStorageLayout(validations, version); + + // skip storage check as it contains variable rename + // TODO: re-enable in future upgrades + + return await fetchOrDeploy(version, provider, async () => { + const deployment = await deploy(contract); + return { ...deployment, layout }; + }); +} + module.exports = { calculateGasMargin, + prepareUpgrade, }; diff --git a/deployments/validators.js b/deployments/validators.js index fdada6c9..d8dfc197 100644 --- a/deployments/validators.js +++ b/deployments/validators.js @@ -1,72 +1,31 @@ -const { ethers, upgrades, network } = require('hardhat'); -const { calculateGasMargin } = require('./utils'); - -let provider = new ethers.providers.Web3Provider(network.provider); - -async function deployValidators() { - const Validators = await ethers.getContractFactory('Validators'); - const proxy = await upgrades.deployProxy(Validators, [], { - initializer: false, - unsafeAllowCustomTypes: true, - }); - await proxy.deployed(); - return proxy.address; +const hre = require('hardhat'); +const { + getProxyAdminFactory, +} = require('@openzeppelin/hardhat-upgrades/dist/proxy-factory'); + +async function prepareOraclesUpgradeData(poolContractAddress) { + const Oracles = await hre.ethers.getContractFactory('Oracles'); + return Oracles.interface.encodeFunctionData('upgrade', [poolContractAddress]); } -async function initializeValidators( - validatorsContractAddress, +async function upgradeOracles( adminAddress, - poolContractAddress, - solosContractAddress -) { - let Validators = await ethers.getContractFactory('Validators'); - Validators = Validators.attach(validatorsContractAddress); - - const { hash } = await Validators.estimateGas - .initialize(adminAddress, poolContractAddress, solosContractAddress) - .then((estimatedGas) => - Validators.initialize( - adminAddress, - poolContractAddress, - solosContractAddress, - { - gasLimit: calculateGasMargin(estimatedGas), - } - ) - ); - return provider.waitForTransaction(hash); -} - -async function deployOracles() { - const Oracles = await ethers.getContractFactory('Oracles'); - const proxy = await upgrades.deployProxy(Oracles, [], { - unsafeAllowCustomTypes: true, - initializer: false, - }); - await proxy.deployed(); - return proxy.address; -} - -async function initializeOracles( + proxyAdminContractAddress, oraclesContractAddress, - adminAddress, - rewardEthTokenContractAddress, - totalRewardsUpdatePeriod + nextImplementation, + data ) { - let Oracles = await ethers.getContractFactory('Oracles'); - Oracles = Oracles.attach(oraclesContractAddress); + const signer = await hre.ethers.provider.getSigner(adminAddress); + const AdminFactory = await getProxyAdminFactory(hre); + const proxyAdmin = AdminFactory.attach(proxyAdminContractAddress); - const { hash } = await Oracles.initialize( - adminAddress, - rewardEthTokenContractAddress, - totalRewardsUpdatePeriod - ); - return provider.waitForTransaction(hash); + const proxy = await proxyAdmin + .connect(signer) + .upgradeAndCall(oraclesContractAddress, nextImplementation, data); + return proxy.address; } module.exports = { - deployValidators, - initializeValidators, - deployOracles, - initializeOracles, + prepareOraclesUpgradeData, + upgradeOracles, }; diff --git a/deployments/vrc.js b/deployments/vrc.js index 12ac999f..3713c28e 100644 --- a/deployments/vrc.js +++ b/deployments/vrc.js @@ -1,5 +1,3 @@ -const { ethers } = require('hardhat'); - // https://github.com/ethereum/eth2.0-specs/blob/dev/solidity_deposit_contract/deposit_contract.json // Commit: e4a9c5f let vrcAbi = [ @@ -60,17 +58,7 @@ let vrcAbi = [ type: 'function', }, ]; -let vrcByteCode = - '0x608060405234801561001057600080fd5b5060005b601f8110156101025760026021826020811061002c57fe5b01546021836020811061003b57fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106100925780518252601f199092019160209182019101610073565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa1580156100d1573d6000803e3d6000fd5b5050506040513d60208110156100e657600080fd5b5051602160018301602081106100f857fe5b0155600101610014565b506118d680620001136000396000f3fe60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220dceca8706b29e917dacf25fceef95acac8d90d765ac926663ce4096195952b6164736f6c634300060b0033'; - -async function deployAndInitializeVRC() { - let vrcFactory = await ethers.getContractFactory(vrcAbi, vrcByteCode); - const VRC = await vrcFactory.deploy(); - return VRC.address; -} module.exports = { - deployAndInitializeVRC, vrcAbi, - vrcByteCode, }; diff --git a/hardhat.config.js b/hardhat.config.js index a837f37c..a514adb4 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -10,7 +10,9 @@ require('hardhat-contract-sizer'); require('hardhat-abi-exporter'); require('@nomiclabs/hardhat-etherscan'); -const optimizerRuns = 5000000; +const GAS_PRICE = 20e9; // 20 Gwei +const BLOCK_NUMBER = 12007856; +const OPTIMIZER_RUNS = 5000000; const log = (...text) => console.log(gray(...['└─> [DEBUG]'].concat(text))); extendEnvironment((hre) => { @@ -21,22 +23,18 @@ function optimizeIfRequired({ hre, taskArguments: { optimizer } }) { if (optimizer || hre.optimizer) { // only show message once if re-run if (hre.optimizer === undefined) { - console.log( - gray('Adding optimizer, runs', yellow(optimizerRuns.toString())) - ); + log(gray('Adding optimizer, runs', yellow(OPTIMIZER_RUNS.toString()))); } // Use optimizer (slower) but simulates real contract size limits and gas usage hre.config.solidity.compilers[0].settings.optimizer = { enabled: true, - runs: optimizerRuns, + runs: OPTIMIZER_RUNS, }; hre.config.networks.hardhat.allowUnlimitedContractSize = false; } else { if (hre.optimizer === undefined) { - console.log( - gray('Optimizer disabled. Unlimited contract sizes allowed.') - ); + log(gray('Optimizer disabled. Unlimited contract sizes allowed.')); } hre.config.solidity.compilers[0].settings.optimizer = { enabled: false }; hre.config.networks.hardhat.allowUnlimitedContractSize = true; @@ -56,23 +54,21 @@ task('compile') task('test') .addFlag('optimizer', 'Compile with the optimizer') .addFlag('gas', 'Compile gas usage') - .addFlag('noWarnings', 'Silence upgrade warnings') .addOptionalParam('grep', 'Filter tests to only those with given logic') .setAction(async (taskArguments, hre, runSuper) => { - const { gas, grep, noWarnings } = taskArguments; + const { gas, grep } = taskArguments; optimizeIfRequired({ hre, taskArguments }); - if (noWarnings) { - console.log(gray('Silencing upgrades warnings')); - hre.upgrades.silenceWarnings(); - } - if (grep) { console.log(gray('Filtering tests to those containing'), yellow(grep)); hre.config.mocha.grep = grep; } + log( + gray('Mainnet fork with block number', yellow(BLOCK_NUMBER.toString())) + ); + if (gas) { console.log( gray(`Enabling ${yellow('gas')} reports, tests will run slower`) @@ -87,16 +83,11 @@ task('test') await runSuper(taskArguments); }); -task('coverage') - .addFlag('noWarnings', 'Silence upgrade warnings') - .setAction(async (taskArguments, hre, runSuper) => { - const { noWarnings } = taskArguments; - if (noWarnings) { - console.log(gray('Silencing upgrades warnings')); - hre.upgrades.silenceWarnings(); - } - await runSuper(taskArguments); - }); +task('coverage').setAction(async (taskArguments, hre, runSuper) => { + log(gray('Mainnet fork with block number', yellow(BLOCK_NUMBER.toString()))); + + await runSuper(taskArguments); +}); task('verify') .addFlag('optimizer', 'Compile with the optimizer') @@ -105,8 +96,6 @@ task('verify') await runSuper(taskArguments); }); -const GAS_PRICE = 20e9; // 20 Gwei - module.exports = { solidity: { version: '0.7.5', @@ -116,12 +105,10 @@ module.exports = { blockGasLimit: 0x1fffffffffffff, gasPrice: GAS_PRICE, allowUnlimitedContractSize: true, - }, - coverage: { - url: 'http://localhost:8555', - blockGasLimit: 0x1fffffffffffff, - gasPrice: GAS_PRICE, - allowUnlimitedContractSize: true, + forking: { + url: process.env.HARDHAT_FORK_API_URL, + blockNumber: BLOCK_NUMBER, + }, }, local: { url: 'http://localhost:8545', @@ -142,15 +129,14 @@ module.exports = { path: './abi', only: [ 'AccessControl', - 'OwnablePausableUpgradeable', - 'IOracles', + 'Oracles', 'IDepositContract', 'IERC20Upgradeable', - 'IPool', - 'IRewardEthToken', - 'ISolos', - 'IStakedEthToken', - 'IValidators', + 'Pool', + 'RewardEthToken', + 'Solos', + 'StakedEthToken', + 'Validators', ], clear: true, flat: true, diff --git a/networks/goerli.md b/networks/goerli.md new file mode 100644 index 00000000..2d1f9310 --- /dev/null +++ b/networks/goerli.md @@ -0,0 +1,46 @@ +# Goerli Contracts + +## Validators + +- Contract: [0xE2F13059454b626e42e04845815E9Ed2E9774bF3](https://goerli.etherscan.io/address/0xE2F13059454b626e42e04845815E9Ed2E9774bF3) +- Transaction: [0x9a5736954e33ca69b290d07d804114ea7aa4817a871b9940a19a87e3a9958974](https://goerli.etherscan.io/tx/0x9a5736954e33ca69b290d07d804114ea7aa4817a871b9940a19a87e3a9958974) + +## Pool + +- Contract: [0x8c1EfEcFb5c4F1099AB0460b5659342943764Df7](https://goerli.etherscan.io/address/0x8c1EfEcFb5c4F1099AB0460b5659342943764Df7) +- Transaction: [0x35323b9efb3871df2852134fc15c76dba1233a665d8f3224c48e4ef55e9f1232](https://goerli.etherscan.io/tx/0x35323b9efb3871df2852134fc15c76dba1233a665d8f3224c48e4ef55e9f1232) + +### Upgrade to v1.1.0 + +- Implementation: [0xAB10021EA5d14156f52414C492bf81859d0b21F6](https://goerli.etherscan.io/address/0xAB10021EA5d14156f52414C492bf81859d0b21F6) +- Transaction: [0xe71758c8df2927dac4f8c3854cbefd5fa73d95dcde38d68a91718d7a702b0dc5](https://goerli.etherscan.io/tx/0xe71758c8df2927dac4f8c3854cbefd5fa73d95dcde38d68a91718d7a702b0dc5) + +## Solos + +- Contract: [0xcf809A020EE599034C010b387F2116237a5B22Bc](https://goerli.etherscan.io/address/0xcf809A020EE599034C010b387F2116237a5B22Bc) +- Transaction: [0x19ef944992fb27c80db82dce243fba62749dc563c0920c65c05c06b1ac2a8a39](https://goerli.etherscan.io/tx/0x19ef944992fb27c80db82dce243fba62749dc563c0920c65c05c06b1ac2a8a39) + +## StakedEthToken + +- Contract: [0x221D9812823DBAb0F1fB40b0D294D9875980Ac19](https://goerli.etherscan.io/address/0x221D9812823DBAb0F1fB40b0D294D9875980Ac19) +- Transaction: [0xd745ea1ff1ada4725d40b2c7e73ba4bbc7171ab513822a0838e21a55d1c3a44c](https://goerli.etherscan.io/tx/0xd745ea1ff1ada4725d40b2c7e73ba4bbc7171ab513822a0838e21a55d1c3a44c) + +## RewardEthToken + +- Contract: [0x826f88d423440c305D9096cC1581Ae751eFCAfB0](https://goerli.etherscan.io/address/0x826f88d423440c305D9096cC1581Ae751eFCAfB0) +- Transaction: [0xdf77776425e06f9d045c33315ed8223dd274abf807687158a39bd34556dd01a6](https://goerli.etherscan.io/tx/0xdf77776425e06f9d045c33315ed8223dd274abf807687158a39bd34556dd01a6) + +## Oracles + +- Contract: [0xE54486fa4eB45716c5725d7A46FDDe810B8E8914](https://goerli.etherscan.io/address/0xE54486fa4eB45716c5725d7A46FDDe810B8E8914) +- Transaction: [0xf8ef8983fb157d8606e06a9ccedd4a6b057d170f0871961e285d84957a7f246c](https://goerli.etherscan.io/tx/0xf8ef8983fb157d8606e06a9ccedd4a6b057d170f0871961e285d84957a7f246c) + +### Upgrade to v1.1.0 + +- Implementation: [0x35e467609D1982BCd7EcAff4e3f1fb22640CF4EF](https://goerli.etherscan.io/address/0x35e467609D1982BCd7EcAff4e3f1fb22640CF4EF) +- Transaction: [0x3922f5ae602033e445f8e191c522d4696a7834c83a03dbb7b548975e6734d015](https://goerli.etherscan.io/tx/0x3922f5ae602033e445f8e191c522d4696a7834c83a03dbb7b548975e6734d015) + +## Proxy Admin + +- Implementation: [0xbba3f4dDD4F705aD2028ee2da64fF3166bDe8cA8](https://goerli.etherscan.io/address/0xbba3f4dDD4F705aD2028ee2da64fF3166bDe8cA8) +- Transaction: [0x8f4bd6ede50b7fc589807a9277c3cd2624d2b5b4f9cda20b589aa2cb8b5a0cc5](https://goerli.etherscan.io/tx/0x8f4bd6ede50b7fc589807a9277c3cd2624d2b5b4f9cda20b589aa2cb8b5a0cc5) diff --git a/package.json b/package.json index 439839be..2322cfc5 100644 --- a/package.json +++ b/package.json @@ -12,17 +12,16 @@ ], "scripts": { "compile": "hardhat compile", - "coverage": "NODE_OPTIONS=\"--max-old-space-size=4096\" hardhat coverage --no-warnings --network coverage", + "coverage": "NODE_OPTIONS=\"--max-old-space-size=4096\" hardhat coverage", "format": "prettier --write \"**/*.js\" \"*.json\"", "lint": "solhint --max-warnings 0 \"contracts/**/*.sol\" && eslint \"**/*.js\"", "lint:fix": "eslint --fix \"**/*.js\"", "slither": "pip3 install --user slither-analyzer && slither .", - "test": "hardhat test --no-warnings", - "test:gas": "./scripts/test.sh", - "deploy": "yarn compile --optimizer && npx hardhat run --no-compile scripts/deploy.js", - "verify": "npx hardhat verify --optimizer", - "deployDAI": "yarn compile --optimizer && npx hardhat run --no-compile scripts/deployDAI.js", - "deployVRC": "npx hardhat run --no-compile scripts/deployVRC.js" + "test": "hardhat test", + "test:gas": "hardhat test --gas --optimizer", + "prepare-upgrade": "yarn compile --optimizer && npx hardhat run --no-compile scripts/prepareUpgrade.js", + "upgrade-contracts": "yarn compile --optimizer && npx hardhat run --no-compile scripts/upgrade.js", + "verify": "npx hardhat verify --optimizer" }, "husky": { "hooks": { @@ -48,33 +47,31 @@ "devDependencies": { "@codechecks/client": "^0.1.10", "@nomiclabs/hardhat-ethers": "^2.0.1", - "@nomiclabs/hardhat-etherscan": "^2.1.0", + "@nomiclabs/hardhat-etherscan": "^2.1.1", "@nomiclabs/hardhat-truffle5": "^2.0.0", "@nomiclabs/hardhat-web3": "^2.0.0", "@openzeppelin/contracts": "^3.3.0", "@openzeppelin/contracts-upgradeable": "^3.3.0", - "@openzeppelin/hardhat-upgrades": "^1.5.0", + "@openzeppelin/hardhat-upgrades": "^1.6.0", "@openzeppelin/test-helpers": "^0.5.10", - "@uniswap/v2-core": "^1.0.1", - "chai": "^4.2.0", + "chai": "^4.3.0", "chalk": "^4.1.0", - "eslint": "^7.18.0", - "eslint-config-prettier": "^7.2.0", + "eslint": "^7.20.0", + "eslint-config-prettier": "^8.1.0", "eslint-plugin-prettier": "^3.3.1", - "eth-sig-util": "^3.0.0", - "ethereumjs-util": "^7.0.7", - "ethers": "^5.0.26", - "ganache-cli": "^6.12.2", - "hardhat": "^2.0.8", + "eth-sig-util": "^3.0.1", + "ethereumjs-util": "^7.0.8", + "ethers": "^5.0.31", + "hardhat": "^2.0.11", "hardhat-abi-exporter": "^2.0.8", "hardhat-contract-sizer": "^2.0.2", "hardhat-gas-reporter": "^1.0.4", - "husky": "^4.3.8", - "lint-staged": "10.5.3", + "husky": "^5.1.1", + "lint-staged": "10.5.4", "prettier": "^2.2.1", "solhint": "^3.3.2", - "solidity-coverage": "^0.7.13", - "web3": "^1.3.3" + "solidity-coverage": "^0.7.15", + "web3": "^1.3.4" }, "dependencies": {} } diff --git a/scripts/deploy.js b/scripts/deploy.js deleted file mode 100644 index 308d92be..00000000 --- a/scripts/deploy.js +++ /dev/null @@ -1,8 +0,0 @@ -const { deployAllContracts } = require('../deployments'); - -deployAllContracts({ transferProxyAdminOwnership: true }) - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/scripts/deployDAI.js b/scripts/deployDAI.js deleted file mode 100644 index 380186b3..00000000 --- a/scripts/deployDAI.js +++ /dev/null @@ -1,21 +0,0 @@ -const { white, green } = require('chalk'); -const { deployAndInitializeERC20Mock } = require('../deployments/tokens'); -const { initialSettings } = require('../deployments/settings'); - -async function main() { - let daiTokenAddress = await deployAndInitializeERC20Mock( - initialSettings.admin, - 'Goerli DAI', - 'goDAI' - ); - console.log( - white(`Deployed Goerli DAI Token contract: ${green(daiTokenAddress)}`) - ); -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/scripts/deployVRC.js b/scripts/deployVRC.js deleted file mode 100644 index b1fd69d1..00000000 --- a/scripts/deployVRC.js +++ /dev/null @@ -1,14 +0,0 @@ -const { white, green } = require('chalk'); -const { deployAndInitializeVRC } = require('../deployments/vrc'); - -async function main() { - let vrcAddress = await deployAndInitializeVRC(); - console.log(white(`Deployed VRC contract: ${green(vrcAddress)}`)); -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/scripts/prepareUpgrade.js b/scripts/prepareUpgrade.js new file mode 100644 index 00000000..69fd525c --- /dev/null +++ b/scripts/prepareUpgrade.js @@ -0,0 +1,8 @@ +const { prepareContractsUpgrades } = require('../deployments'); + +prepareContractsUpgrades() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/test.sh b/scripts/test.sh deleted file mode 100755 index 4683c11b..00000000 --- a/scripts/test.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash - -# Exit script as soon as a command fails. -set -o errexit - -GANACHE_PORT=${GANACHE_PORT:-8545} - -# Executes cleanup function at script exit. -trap cleanup EXIT - -cleanup() { - # Kill the ganache instance that we started (if we started one and if it's still running). - if [[ -n "$ganache_pid" ]] && ps -p "${ganache_pid}" > /dev/null; then - kill -9 "${ganache_pid}" - fi -} - -ganache_running() { - nc -z localhost "${GANACHE_PORT}" -} - -if ganache_running; then - echo "Using existing ganache instance..." -else - echo "Starting ganache instance..." - node_modules/.bin/ganache-cli --port="${GANACHE_PORT}" --accounts=5000 --defaultBalanceEther=1000000 > /dev/null & - - ganache_pid=$! - echo "Waiting for ganache to launch on port ${GANACHE_PORT}..." - - while ! ganache_running; do - sleep 1 - done - echo "Ganache launched!" -fi - -npx hardhat test --gas --optimizer --no-warnings --network local "$@" diff --git a/scripts/upgrade.js b/scripts/upgrade.js new file mode 100644 index 00000000..4a911228 --- /dev/null +++ b/scripts/upgrade.js @@ -0,0 +1,8 @@ +const { upgradeContracts } = require('../deployments'); + +upgradeContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/test/Oracles.test.js b/test/Oracles.test.js deleted file mode 100644 index 88222941..00000000 --- a/test/Oracles.test.js +++ /dev/null @@ -1,313 +0,0 @@ -const { expect } = require('chai'); -const { - expectEvent, - expectRevert, - ether, - BN, -} = require('@openzeppelin/test-helpers'); -const { - deployOracles, - initializeOracles, -} = require('../deployments/validators'); -const { - deployRewardEthToken, - deployStakedEthToken, - initializeRewardEthToken, - initializeStakedEthToken, -} = require('../deployments/tokens'); - -const RewardEthToken = artifacts.require('RewardEthToken'); -const StakedEthToken = artifacts.require('StakedEthToken'); -const Oracles = artifacts.require('Oracles'); - -const totalRewardsUpdatePeriod = '86400'; - -contract('Oracles', ([_, ...accounts]) => { - let oracles, rewardEthToken, stakedEthToken; - let [ - admin, - oracle, - anotherOracle, - poolContractAddress, - anyone, - ...otherAccounts - ] = accounts; - - beforeEach(async () => { - const stakedEthTokenContractAddress = await deployStakedEthToken(); - const rewardEthTokenContractAddress = await deployRewardEthToken(); - const oraclesContractAddress = await deployOracles(); - await initializeStakedEthToken( - stakedEthTokenContractAddress, - admin, - rewardEthTokenContractAddress, - poolContractAddress - ); - await initializeRewardEthToken( - rewardEthTokenContractAddress, - admin, - stakedEthTokenContractAddress, - oraclesContractAddress - ); - - await initializeOracles( - oraclesContractAddress, - admin, - rewardEthTokenContractAddress, - totalRewardsUpdatePeriod - ); - - oracles = await Oracles.at(oraclesContractAddress); - rewardEthToken = await RewardEthToken.at(rewardEthTokenContractAddress); - stakedEthToken = await StakedEthToken.at(stakedEthTokenContractAddress); - }); - - describe('assigning', () => { - it('admin can assign oracle role to another account', async () => { - const receipt = await oracles.addOracle(oracle, { - from: admin, - }); - expectEvent(receipt, 'RoleGranted', { - role: await oracles.ORACLE_ROLE(), - account: oracle, - sender: admin, - }); - expect(await oracles.isOracle(oracle)).equal(true); - expect(await oracles.isOracle(admin)).equal(false); - expect(await oracles.isOracle(anyone)).equal(false); - }); - - it('others cannot assign oracle role to an account', async () => { - await expectRevert( - oracles.addOracle(oracle, { from: anyone }), - 'AccessControl: sender must be an admin to grant' - ); - expect(await oracles.isOracle(oracle)).equal(false); - expect(await oracles.isOracle(anyone)).equal(false); - }); - - it('oracles cannot assign oracle role to others', async () => { - await oracles.addOracle(oracle, { from: admin }); - await expectRevert( - oracles.addOracle(anotherOracle, { from: oracle }), - 'AccessControl: sender must be an admin to grant' - ); - expect(await oracles.isOracle(oracle)).equal(true); - expect(await oracles.isOracle(anotherOracle)).equal(false); - }); - }); - - describe('removing', () => { - beforeEach(async () => { - await oracles.addOracle(oracle, { from: admin }); - await oracles.addOracle(anotherOracle, { from: admin }); - }); - - it('anyone cannot remove oracles', async () => { - await expectRevert( - oracles.removeOracle(oracle, { from: anyone }), - 'AccessControl: sender must be an admin to revoke' - ); - expect(await oracles.isOracle(oracle)).equal(true); - expect(await oracles.isOracle(anotherOracle)).equal(true); - }); - - it('oracle cannot remove other oracles', async () => { - await expectRevert( - oracles.removeOracle(anotherOracle, { from: oracle }), - 'AccessControl: sender must be an admin to revoke' - ); - expect(await oracles.isOracle(oracle)).equal(true); - expect(await oracles.isOracle(anotherOracle)).equal(true); - }); - - it('admins can remove oracles', async () => { - const receipt = await oracles.removeOracle(oracle, { - from: admin, - }); - expectEvent(receipt, 'RoleRevoked', { - role: await oracles.ORACLE_ROLE(), - account: oracle, - sender: admin, - }); - expect(await oracles.isOracle(oracle)).equal(false); - expect(await oracles.isOracle(anotherOracle)).equal(true); - }); - }); - - describe('uniswap pairs', () => { - let [pair1, pair2, pair3] = otherAccounts; - let pairs = [pair1, pair2, pair3]; - - it('admin user can set rETH2 uniswap pairs', async () => { - const receipt = await oracles.setRewardEthUniswapPairs(pairs, { - from: admin, - }); - expectEvent(receipt, 'RewardEthUniswapPairsUpdated', { - rewardEthUniswapPairs: pairs, - }); - expect(await oracles.getRewardEthUniswapPairs()).to.have.members(pairs); - }); - - it('anyone cannot set rETH2 uniswap pairs', async () => { - await expectRevert( - oracles.setRewardEthUniswapPairs(pairs, { from: anyone }), - 'OwnablePausable: access denied' - ); - expect(await oracles.getRewardEthUniswapPairs()).to.have.members([]); - }); - }); - - describe('total rewards update period', () => { - it('admin user update total rewards period', async () => { - let newTotalRewardsUpdatePeriod = new BN('172800'); - const receipt = await oracles.setTotalRewardsUpdatePeriod( - newTotalRewardsUpdatePeriod, - { - from: admin, - } - ); - expectEvent(receipt, 'TotalRewardsUpdatePeriodUpdated', { - totalRewardsUpdatePeriod: newTotalRewardsUpdatePeriod, - }); - expect(await oracles.totalRewardsUpdatePeriod()).bignumber.equal( - newTotalRewardsUpdatePeriod - ); - }); - - it('anyone cannot update total rewards period', async () => { - let newTotalRewardsUpdatePeriod = new BN('172800'); - await expectRevert( - oracles.setTotalRewardsUpdatePeriod(newTotalRewardsUpdatePeriod, { - from: anyone, - }), - 'OwnablePausable: access denied' - ); - expect(await oracles.totalRewardsUpdatePeriod()).bignumber.equal( - new BN(totalRewardsUpdatePeriod) - ); - }); - }); - - describe('total rewards voting', () => { - let [oracle1, oracle2, oracle3, oracle4] = otherAccounts; - - beforeEach(async () => { - await oracles.addOracle(oracle1, { from: admin }); - await oracles.addOracle(oracle2, { from: admin }); - await oracles.addOracle(oracle3, { from: admin }); - await oracles.addOracle(oracle4, { from: admin }); - - await stakedEthToken.mint(anyone, ether('32'), { - from: poolContractAddress, - }); - }); - - it('fails to vote when contract is paused', async () => { - await oracles.pause({ from: admin }); - expect(await oracles.paused()).equal(true); - - await expectRevert( - oracles.voteForTotalRewards(ether('1'), { - from: oracle1, - }), - 'Pausable: paused' - ); - expect(await rewardEthToken.totalRewards()).to.bignumber.equal(new BN(0)); - }); - - it('only oracle can submit new total rewards', async () => { - await expectRevert( - oracles.voteForTotalRewards(ether('1'), { - from: anyone, - }), - 'Oracles: access denied' - ); - expect(await rewardEthToken.totalRewards()).to.bignumber.equal(new BN(0)); - }); - - it('cannot vote for the same total rewards twice', async () => { - await oracles.voteForTotalRewards(ether('1'), { - from: oracle1, - }); - expect(await oracles.hasTotalRewardsVote(oracle1, ether('1'))).to.equal( - true - ); - await expectRevert( - oracles.voteForTotalRewards(ether('1'), { - from: oracle1, - }), - 'Oracles: already voted' - ); - expect(await rewardEthToken.totalRewards()).to.bignumber.equal(new BN(0)); - }); - - it('does not submit rewards when not enough votes', async () => { - const receipt = await oracles.voteForTotalRewards(ether('1'), { - from: oracle1, - }); - expectEvent(receipt, 'TotalRewardsVoteSubmitted', { - oracle: oracle1, - totalRewards: ether('1'), - nonce: new BN(0), - }); - expect(await oracles.hasTotalRewardsVote(oracle1, ether('1'))).to.equal( - true - ); - expect(await rewardEthToken.totalRewards()).to.bignumber.equal(new BN(0)); - }); - - it('submits total rewards when enough votes collected', async () => { - // oracle 1 submits - let receipt = await oracles.voteForTotalRewards(ether('1'), { - from: oracle1, - }); - expect(await oracles.hasTotalRewardsVote(oracle1, ether('1'))).to.equal( - true - ); - expectEvent(receipt, 'TotalRewardsVoteSubmitted', { - oracle: oracle1, - totalRewards: ether('1'), - nonce: new BN(0), - }); - - // oracle 2 submits - receipt = await oracles.voteForTotalRewards(ether('1'), { - from: oracle2, - }); - expectEvent(receipt, 'TotalRewardsVoteSubmitted', { - oracle: oracle2, - totalRewards: ether('1'), - nonce: new BN(0), - }); - - // oracle 3 submits - receipt = await oracles.voteForTotalRewards(ether('1'), { - from: oracle3, - }); - expectEvent(receipt, 'TotalRewardsVoteSubmitted', { - oracle: oracle3, - totalRewards: ether('1'), - nonce: new BN(0), - }); - - // update submitted - expect(await rewardEthToken.totalRewards()).to.bignumber.equal( - ether('1') - ); - - // vote again - receipt = await oracles.voteForTotalRewards(ether('1'), { - from: oracle1, - }); - expect(await oracles.hasTotalRewardsVote(oracle1, ether('1'))).to.equal( - true - ); - expectEvent(receipt, 'TotalRewardsVoteSubmitted', { - oracle: oracle1, - totalRewards: ether('1'), - nonce: new BN(1), - }); - }); - }); -}); diff --git a/test/Validators.test.js b/test/Validators.test.js index 0effae6a..c88a5689 100644 --- a/test/Validators.test.js +++ b/test/Validators.test.js @@ -1,131 +1,144 @@ -const { expectRevert, expectEvent } = require('@openzeppelin/test-helpers'); const { - deployValidators, - initializeValidators, -} = require('../deployments/validators'); + expectRevert, + expectEvent, + ether, + balance, + send, +} = require('@openzeppelin/test-helpers'); +const { upgradeContracts } = require('../deployments'); +const { validatorParams } = require('./pool/validatorParams'); +const { contractSettings, contracts } = require('../deployments/settings'); +const { + stopImpersonatingAccount, + impersonateAccount, + resetFork, +} = require('./utils'); +const Pool = artifacts.require('Pool'); const Validators = artifacts.require('Validators'); const validatorId = web3.utils.soliditySha3( '0xb07ef3635f585b5baeb057a45e7337ab5ba2b1205b43fac3a46e0add8aab242b0fb35a54373ad809405ca05c9cbf34c7' ); +const validatorDeposit = ether('32'); -contract( - 'Validators', - ([ - _, - poolContractAddress, - solosContractAddress, - admin, - operator, - anotherOperator, - anyone, - ]) => { - let validators; +contract('Validators', ([operator, anotherOperator, anyone]) => { + const admin = contractSettings.admin; + let pool, validators; - beforeEach(async () => { - validators = await Validators.at(await deployValidators()); - await initializeValidators( - validators.address, - admin, - poolContractAddress, - solosContractAddress - ); + after(async () => stopImpersonatingAccount(admin)); + + beforeEach(async () => { + await impersonateAccount(admin); + await send.ether(anyone, admin, ether('5')); + + await upgradeContracts(); + pool = await Pool.at(contracts.pool); + validators = await Validators.at(contracts.validators); + await validators.addOperator(operator, { from: admin }); + }); + + afterEach(async () => resetFork()); + + it('only collectors can register validators', async () => { + await expectRevert( + validators.register(validatorId, { + from: anyone, + }), + 'Validators: access denied' + ); + }); + + it('fails to register validator with paused contract', async () => { + await validators.pause({ from: admin }); + expect(await validators.paused()).equal(true); + let poolBalance = await balance.current(pool.address); + let depositAmount = validatorDeposit.sub(poolBalance); + await pool.addDeposit({ + from: anyone, + value: depositAmount, }); - it('only collectors can register validators', async () => { - await expectRevert( - validators.register(validatorId, { - from: anyone, - }), - 'Validators: access denied' - ); + await expectRevert( + pool.registerValidator(validatorParams[0], { + from: operator, + }), + 'Pausable: paused' + ); + }); - await validators.register(validatorId, { - from: solosContractAddress, + describe('assigning operators', () => { + it('admin can assign operator role to another account', async () => { + const receipt = await validators.addOperator(anotherOperator, { + from: admin, }); + expectEvent(receipt, 'RoleGranted', { + role: await validators.OPERATOR_ROLE(), + account: anotherOperator, + sender: admin, + }); + expect(await validators.isOperator(operator)).equal(true); + expect(await validators.isOperator(anotherOperator)).equal(true); + expect(await validators.isOperator(admin)).equal(false); + expect(await validators.isOperator(anyone)).equal(false); }); - it('fails to register validator with paused contract', async () => { - await validators.pause({ from: admin }); - expect(await validators.paused()).equal(true); + it('others cannot assign operator role to an account', async () => { await expectRevert( - validators.register(validatorId, { - from: solosContractAddress, - }), - 'Pausable: paused' + validators.addOperator(anotherOperator, { from: anyone }), + 'AccessControl: sender must be an admin to grant' ); + expect(await validators.isOperator(operator)).equal(true); + expect(await validators.isOperator(anotherOperator)).equal(false); + expect(await validators.isOperator(anyone)).equal(false); }); - describe('assigning operators', () => { - it('admin can assign operator role to another account', async () => { - const receipt = await validators.addOperator(operator, { from: admin }); - expectEvent(receipt, 'RoleGranted', { - role: await validators.OPERATOR_ROLE(), - account: operator, - sender: admin, - }); - expect(await validators.isOperator(operator)).equal(true); - expect(await validators.isOperator(admin)).equal(false); - expect(await validators.isOperator(anyone)).equal(false); - }); - - it('others cannot assign operator role to an account', async () => { - await expectRevert( - validators.addOperator(operator, { from: anyone }), - 'AccessControl: sender must be an admin to grant' - ); - expect(await validators.isOperator(operator)).equal(false); - expect(await validators.isOperator(anyone)).equal(false); - }); + it('operators cannot assign operator role to others', async () => { + await validators.addOperator(operator, { from: admin }); + await expectRevert( + validators.addOperator(anotherOperator, { from: operator }), + 'AccessControl: sender must be an admin to grant' + ); + expect(await validators.isOperator(operator)).equal(true); + expect(await validators.isOperator(anotherOperator)).equal(false); + }); + }); - it('operators cannot assign operator role to others', async () => { - await validators.addOperator(operator, { from: admin }); - await expectRevert( - validators.addOperator(anotherOperator, { from: operator }), - 'AccessControl: sender must be an admin to grant' - ); - expect(await validators.isOperator(operator)).equal(true); - expect(await validators.isOperator(anotherOperator)).equal(false); - }); + describe('removing operators', () => { + beforeEach(async () => { + await validators.addOperator(operator, { from: admin }); + await validators.addOperator(anotherOperator, { from: admin }); }); - describe('removing operators', () => { - beforeEach(async () => { - await validators.addOperator(operator, { from: admin }); - await validators.addOperator(anotherOperator, { from: admin }); - }); + it('anyone cannot remove operators', async () => { + await expectRevert( + validators.removeOperator(operator, { from: anyone }), + 'AccessControl: sender must be an admin to revoke' + ); + expect(await validators.isOperator(operator)).equal(true); + expect(await validators.isOperator(anotherOperator)).equal(true); + }); - it('anyone cannot remove operators', async () => { - await expectRevert( - validators.removeOperator(operator, { from: anyone }), - 'AccessControl: sender must be an admin to revoke' - ); - expect(await validators.isOperator(operator)).equal(true); - expect(await validators.isOperator(anotherOperator)).equal(true); - }); + it('operator cannot remove other operators', async () => { + await expectRevert( + validators.removeOperator(anotherOperator, { from: operator }), + 'AccessControl: sender must be an admin to revoke' + ); + expect(await validators.isOperator(operator)).equal(true); + expect(await validators.isOperator(anotherOperator)).equal(true); + }); - it('operator cannot remove other operators', async () => { - await expectRevert( - validators.removeOperator(anotherOperator, { from: operator }), - 'AccessControl: sender must be an admin to revoke' - ); - expect(await validators.isOperator(operator)).equal(true); - expect(await validators.isOperator(anotherOperator)).equal(true); + it('admins can remove operators', async () => { + const receipt = await validators.removeOperator(operator, { + from: admin, }); - - it('admins can remove operators', async () => { - const receipt = await validators.removeOperator(operator, { - from: admin, - }); - expectEvent(receipt, 'RoleRevoked', { - role: await validators.OPERATOR_ROLE(), - account: operator, - sender: admin, - }); - expect(await validators.isOperator(operator)).equal(false); - expect(await validators.isOperator(anotherOperator)).equal(true); + expectEvent(receipt, 'RoleRevoked', { + role: await validators.OPERATOR_ROLE(), + account: operator, + sender: admin, }); + expect(await validators.isOperator(operator)).equal(false); + expect(await validators.isOperator(anotherOperator)).equal(true); }); - } -); + }); +}); diff --git a/test/oracles/Oracles.test.js b/test/oracles/Oracles.test.js new file mode 100644 index 00000000..d7a61420 --- /dev/null +++ b/test/oracles/Oracles.test.js @@ -0,0 +1,320 @@ +const { expect } = require('chai'); +const { + expectEvent, + expectRevert, + ether, + BN, + send, +} = require('@openzeppelin/test-helpers'); +const { + impersonateAccount, + stopImpersonatingAccount, + resetFork, + getOracleAccounts, +} = require('../utils'); +const { contractSettings, contracts } = require('../../deployments/settings'); +const { upgradeContracts } = require('../../deployments'); + +const RewardEthToken = artifacts.require('RewardEthToken'); +const Oracles = artifacts.require('Oracles'); +const Pool = artifacts.require('Pool'); + +contract('Oracles', ([_, ...accounts]) => { + let admin = contractSettings.admin; + let oracles, rewardEthToken, pool; + let [oracle, anotherOracle, anyone] = accounts; + + after(async () => stopImpersonatingAccount(admin)); + + beforeEach(async () => { + // update contract settings before upgrade + contractSettings.activatedValidators = '10'; + contractSettings.pendingValidators = '2'; + + await impersonateAccount(admin); + await send.ether(anyone, admin, ether('5')); + + await upgradeContracts(); + + oracles = await Oracles.at(contracts.oracles); + pool = await Pool.at(contracts.pool); + rewardEthToken = await RewardEthToken.at(contracts.rewardEthToken); + }); + + afterEach(async () => resetFork()); + + describe('assigning', () => { + it('admin can assign oracle role to another account', async () => { + const receipt = await oracles.addOracle(oracle, { + from: admin, + }); + expectEvent(receipt, 'RoleGranted', { + role: await oracles.ORACLE_ROLE(), + account: oracle, + sender: admin, + }); + expect(await oracles.isOracle(oracle)).equal(true); + expect(await oracles.isOracle(admin)).equal(false); + expect(await oracles.isOracle(anyone)).equal(false); + }); + + it('others cannot assign oracle role to an account', async () => { + await expectRevert( + oracles.addOracle(oracle, { from: anyone }), + 'AccessControl: sender must be an admin to grant' + ); + expect(await oracles.isOracle(oracle)).equal(false); + expect(await oracles.isOracle(anyone)).equal(false); + }); + + it('oracles cannot assign oracle role to others', async () => { + await oracles.addOracle(oracle, { from: admin }); + await expectRevert( + oracles.addOracle(anotherOracle, { from: oracle }), + 'AccessControl: sender must be an admin to grant' + ); + expect(await oracles.isOracle(oracle)).equal(true); + expect(await oracles.isOracle(anotherOracle)).equal(false); + }); + }); + + describe('removing', () => { + beforeEach(async () => { + await oracles.addOracle(oracle, { from: admin }); + await oracles.addOracle(anotherOracle, { from: admin }); + }); + + it('anyone cannot remove oracles', async () => { + await expectRevert( + oracles.removeOracle(oracle, { from: anyone }), + 'AccessControl: sender must be an admin to revoke' + ); + expect(await oracles.isOracle(oracle)).equal(true); + expect(await oracles.isOracle(anotherOracle)).equal(true); + }); + + it('oracle cannot remove other oracles', async () => { + await expectRevert( + oracles.removeOracle(anotherOracle, { from: oracle }), + 'AccessControl: sender must be an admin to revoke' + ); + expect(await oracles.isOracle(oracle)).equal(true); + expect(await oracles.isOracle(anotherOracle)).equal(true); + }); + + it('admins can remove oracles', async () => { + const receipt = await oracles.removeOracle(oracle, { + from: admin, + }); + expectEvent(receipt, 'RoleRevoked', { + role: await oracles.ORACLE_ROLE(), + account: oracle, + sender: admin, + }); + expect(await oracles.isOracle(oracle)).equal(false); + expect(await oracles.isOracle(anotherOracle)).equal(true); + }); + }); + + describe('oracles sync period', () => { + it('admin user can update sync period', async () => { + let newSyncPeriod = new BN('172800'); + const receipt = await oracles.setSyncPeriod(newSyncPeriod, { + from: admin, + }); + expectEvent(receipt, 'SyncPeriodUpdated', { + syncPeriod: newSyncPeriod, + sender: admin, + }); + expect(await oracles.syncPeriod()).bignumber.equal(newSyncPeriod); + }); + + it('anyone cannot update oracles sync period', async () => { + let newSyncPeriod = new BN('172800'); + await expectRevert( + oracles.setSyncPeriod(newSyncPeriod, { + from: anyone, + }), + 'OwnablePausable: access denied' + ); + expect(await oracles.syncPeriod()).bignumber.equal( + new BN(contractSettings.oraclesSyncPeriod) + ); + }); + }); + + describe('oracles voting', () => { + let oracleAccounts = []; + let prevTotalRewards, + newTotalRewards, + currentNonce, + pendingValidators, + activatedValidators; + + beforeEach(async () => { + oracleAccounts = await getOracleAccounts({ oracles }); + prevTotalRewards = await rewardEthToken.totalRewards(); + newTotalRewards = prevTotalRewards.add(ether('10')); + currentNonce = await oracles.currentNonce(); + + activatedValidators = new BN(contractSettings.activatedValidators); + pendingValidators = new BN(contractSettings.pendingValidators); + }); + + it('fails to vote when contract is paused', async () => { + await oracles.pause({ from: admin }); + expect(await oracles.paused()).equal(true); + + await expectRevert( + oracles.vote(newTotalRewards, activatedValidators, { + from: oracleAccounts[0], + }), + 'Pausable: paused' + ); + }); + + it('only oracle can submit vote', async () => { + await expectRevert( + oracles.vote(newTotalRewards, activatedValidators, { + from: anyone, + }), + 'Oracles: access denied' + ); + }); + + it('cannot vote twice', async () => { + await oracles.vote(newTotalRewards, activatedValidators, { + from: oracleAccounts[0], + }); + expect( + await oracles.hasVote( + oracleAccounts[0], + newTotalRewards, + activatedValidators + ) + ).to.equal(true); + + await expectRevert( + oracles.vote(newTotalRewards, activatedValidators, { + from: oracleAccounts[0], + }), + 'Oracles: already voted' + ); + }); + + it('does not submit new data when not enough votes', async () => { + const receipt = await oracles.vote(newTotalRewards, activatedValidators, { + from: oracleAccounts[0], + }); + expectEvent(receipt, 'VoteSubmitted', { + oracle: oracleAccounts[0], + totalRewards: newTotalRewards, + activatedValidators, + nonce: currentNonce, + }); + expect( + await oracles.hasVote( + oracleAccounts[0], + newTotalRewards, + activatedValidators + ) + ).to.equal(true); + expect(await rewardEthToken.totalRewards()).to.bignumber.equal( + prevTotalRewards + ); + expect(await pool.activatedValidators()).to.bignumber.equal( + new BN(activatedValidators) + ); + expect(await pool.pendingValidators()).to.bignumber.equal( + pendingValidators + ); + }); + + it('submits data when enough votes collected', async () => { + let newActivatedValidators = activatedValidators.add(pendingValidators); + for (let i = 0; i < oracleAccounts.length; i++) { + let receipt = await oracles.vote( + newTotalRewards, + newActivatedValidators, + { + from: oracleAccounts[i], + } + ); + if (!prevTotalRewards.eq(await rewardEthToken.totalRewards())) { + // data submitted + break; + } + expect( + await oracles.hasVote( + oracleAccounts[i], + newTotalRewards, + newActivatedValidators + ) + ).to.equal(true); + expectEvent(receipt, 'VoteSubmitted', { + oracle: oracleAccounts[i], + totalRewards: newTotalRewards, + activatedValidators: newActivatedValidators, + nonce: currentNonce, + }); + } + + // update submitted + expect(await rewardEthToken.totalRewards()).to.bignumber.equal( + newTotalRewards + ); + expect(await pool.activatedValidators()).to.bignumber.equal( + newActivatedValidators + ); + expect(await pool.pendingValidators()).to.bignumber.equal(new BN(0)); + + // new vote comes with different nonce + let receipt = await oracles.vote( + newTotalRewards, + newActivatedValidators, + { + from: oracleAccounts[0], + } + ); + expect( + await oracles.hasVote( + oracleAccounts[0], + newTotalRewards, + newActivatedValidators + ) + ).to.equal(true); + expectEvent(receipt, 'VoteSubmitted', { + oracle: oracleAccounts[0], + totalRewards: newTotalRewards, + activatedValidators: newActivatedValidators, + nonce: currentNonce.add(new BN(1)), + }); + }); + + it('does not update activation data when did not change', async () => { + activatedValidators = new BN(contractSettings.activatedValidators); + pendingValidators = await pool.pendingValidators(); + + for (let i = 0; i < oracleAccounts.length; i++) { + await oracles.vote(newTotalRewards, activatedValidators, { + from: oracleAccounts[i], + }); + if (!prevTotalRewards.eq(await rewardEthToken.totalRewards())) { + // data submitted + break; + } + } + + // update submitted + expect(await rewardEthToken.totalRewards()).to.bignumber.equal( + newTotalRewards + ); + expect(await pool.activatedValidators()).to.bignumber.equal( + activatedValidators + ); + expect(await pool.pendingValidators()).to.bignumber.equal( + pendingValidators + ); + }); + }); +}); diff --git a/test/oracles/upgrading.test.js b/test/oracles/upgrading.test.js new file mode 100644 index 00000000..71a162d2 --- /dev/null +++ b/test/oracles/upgrading.test.js @@ -0,0 +1,58 @@ +const { expectRevert, send, ether } = require('@openzeppelin/test-helpers'); +const { contractSettings, contracts } = require('../../deployments/settings'); +const { upgradeContracts } = require('../../deployments'); +const { + impersonateAccount, + stopImpersonatingAccount, + resetFork, +} = require('../utils'); + +const Oracles = artifacts.require('Oracles'); +const Pool = artifacts.require('Pool'); + +contract('Oracles (upgrading)', ([anyone]) => { + let admin = contractSettings.admin; + let oracles, pool; + + after(async () => stopImpersonatingAccount(admin)); + + beforeEach(async () => { + await impersonateAccount(admin); + await send.ether(anyone, admin, ether('5')); + + await upgradeContracts(); + + oracles = await Oracles.at(contracts.oracles); + pool = await Pool.at(contracts.pool); + }); + + afterEach(async () => resetFork()); + + it('fails to upgrade with not admin privilege', async () => { + await expectRevert( + oracles.upgrade(pool.address, { + from: anyone, + }), + 'OwnablePausable: access denied' + ); + }); + + it('fails to upgrade when not paused', async () => { + await expectRevert( + oracles.upgrade(pool.address, { + from: admin, + }), + 'Pausable: not paused' + ); + }); + + it('fails to upgrade twice', async () => { + await oracles.pause({ from: admin }); + await expectRevert( + oracles.upgrade(pool.address, { + from: admin, + }), + 'Oracles: already upgraded' + ); + }); +}); diff --git a/test/pool/addDeposit.test.js b/test/pool/addDeposit.test.js index 522fb25a..fe125e9d 100644 --- a/test/pool/addDeposit.test.js +++ b/test/pool/addDeposit.test.js @@ -1,85 +1,416 @@ const { expect } = require('chai'); -const { ether, expectRevert } = require('@openzeppelin/test-helpers'); -const { deployAllContracts } = require('../../deployments'); const { + ether, + balance, + send, + expectRevert, + expectEvent, + BN, +} = require('@openzeppelin/test-helpers'); +const { + stopImpersonatingAccount, + impersonateAccount, + resetFork, getDepositAmount, - checkCollectorBalance, - checkPoolCollectedAmount, - checkStakedEthToken, } = require('../utils'); +const { upgradeContracts } = require('../../deployments'); +const { contractSettings, contracts } = require('../../deployments/settings'); +const { checkCollectorBalance, checkStakedEthToken } = require('../utils'); +const { validatorParams } = require('./validatorParams'); const Pool = artifacts.require('Pool'); const StakedEthToken = artifacts.require('StakedEthToken'); +const Validators = artifacts.require('Validators'); + +const withdrawalCredentials = + '0x0072ea0cf49536e3c66c787f705186df9a4378083753ae9536d65b3ad7fcddc4'; + +contract('Pool (add deposit)', ([sender1, sender2, sender3, operator]) => { + const admin = contractSettings.admin; + let pool, + stakedEthToken, + totalSupply, + poolBalance, + activatedValidators, + pendingValidators; -contract('Pool (add deposit)', ([_, admin, sender1, sender2]) => { - let pool, stakedEthToken; + after(async () => stopImpersonatingAccount(admin)); beforeEach(async () => { - let { - pool: poolContractAddress, - stakedEthToken: stakedEthTokenContractAddress, - } = await deployAllContracts({ initialAdmin: admin }); - pool = await Pool.at(poolContractAddress); - stakedEthToken = await StakedEthToken.at(stakedEthTokenContractAddress); + // update contract settings before upgrade + contractSettings.activatedValidators = '10'; + contractSettings.pendingValidators = '0'; + + // reset contract settings + activatedValidators = new BN(contractSettings.activatedValidators); + pendingValidators = new BN(contractSettings.pendingValidators); + + await impersonateAccount(admin); + await send.ether(sender3, admin, ether('5')); + await upgradeContracts(); + + pool = await Pool.at(contracts.pool); + stakedEthToken = await StakedEthToken.at(contracts.stakedEthToken); + + totalSupply = await stakedEthToken.totalSupply(); + poolBalance = await balance.current(pool.address); }); - it('fails to add a deposit with zero amount', async () => { - await expectRevert( - pool.addDeposit({ from: sender1, value: ether('0') }), - 'Pool: invalid deposit amount' - ); - await checkCollectorBalance(pool); - await checkPoolCollectedAmount(pool); + afterEach(async () => resetFork()); + + describe('adding deposit', () => { + it('fails to add a deposit with zero amount', async () => { + await expectRevert( + pool.addDeposit({ from: sender1, value: ether('0') }), + 'Pool: invalid deposit amount' + ); + }); + + it('fails to add a deposit to paused pool', async () => { + await pool.pause({ from: admin }); + expect(await pool.paused()).equal(true); + + await expectRevert( + pool.addDeposit({ + from: sender1, + value: ether('1'), + }), + 'Pausable: paused' + ); + }); + + it('mints tokens for users with deposit less than min activating', async () => { + // User 1 creates a deposit + let depositAmount1 = getDepositAmount({ + max: new BN(contractSettings.minActivatingDeposit), + }); + totalSupply = totalSupply.add(depositAmount1); + poolBalance = poolBalance.add(depositAmount1); + + await pool.addDeposit({ + from: sender1, + value: depositAmount1, + }); + await checkStakedEthToken({ + stakedEthToken, + totalSupply, + account: sender1, + balance: depositAmount1, + deposit: depositAmount1, + }); + + // User 2 creates a deposit + let depositAmount2 = getDepositAmount({ + max: new BN(contractSettings.minActivatingDeposit), + }); + totalSupply = totalSupply.add(depositAmount2); + poolBalance = poolBalance.add(depositAmount2); + + await pool.addDeposit({ + from: sender2, + value: depositAmount2, + }); + await checkStakedEthToken({ + stakedEthToken, + totalSupply, + account: sender2, + balance: depositAmount2, + deposit: depositAmount2, + }); + + // check contract balance + await checkCollectorBalance(pool, poolBalance); + }); + + it('places deposit of user to the activation queue with exceeded pending validators limit', async () => { + await pool.setPendingValidatorsLimit('1000', { from: admin }); // 10 % + await pool.setMinActivatingDeposit(ether('0.01'), { from: admin }); + + // deposit more than 10 % + let depositAmount = ether('32').mul(new BN(2)); + poolBalance = poolBalance.add(depositAmount); + let validatorIndex = activatedValidators.add(new BN(2)); + + // check deposit amount placed in activation queue + let receipt = await pool.addDeposit({ + from: sender1, + value: depositAmount, + }); + await expectEvent(receipt, 'ActivationScheduled', { + sender: sender1, + validatorIndex, + value: depositAmount, + }); + expect( + await pool.activations(sender1, validatorIndex) + ).to.bignumber.equal(depositAmount); + + // check contract balance + await checkCollectorBalance(pool, poolBalance); + expect(await stakedEthToken.totalSupply()).to.bignumber.equal( + totalSupply + ); + }); + + it('activates deposit of user immediately with not exceeded pending validators limit', async () => { + await pool.setPendingValidatorsLimit('1000', { from: admin }); // 10 % + await pool.setMinActivatingDeposit(ether('0.01'), { from: admin }); + + // deposit less than 10 % + let depositAmount = ether('32'); + poolBalance = poolBalance.add(depositAmount); + let validatorIndex = activatedValidators + .add(pendingValidators) + .add(new BN(1)); + totalSupply = totalSupply.add(depositAmount); + + // check deposit amount added immediately + await pool.addDeposit({ + from: sender1, + value: depositAmount, + }); + await checkStakedEthToken({ + stakedEthToken, + totalSupply, + account: sender1, + balance: depositAmount, + deposit: depositAmount, + }); + expect( + await pool.activations(sender1, validatorIndex) + ).to.bignumber.equal(new BN(0)); + + // check contract balance + await checkCollectorBalance(pool, poolBalance); + }); }); - it('fails to add a deposit to paused pool', async () => { - await pool.pause({ from: admin }); - expect(await pool.paused()).equal(true); + describe('activating', () => { + let validatorIndex, depositAmount; + + beforeEach(async () => { + await pool.setPendingValidatorsLimit('1', { from: admin }); // 0.01 % + await pool.setMinActivatingDeposit(ether('0.01'), { from: admin }); + + depositAmount = ether('32'); + await pool.addDeposit({ + from: sender1, + value: depositAmount, + }); + validatorIndex = activatedValidators.add(new BN(1)); + + let validators = await Validators.at(contracts.validators); + await validators.addOperator(operator, { from: admin }); + await pool.setWithdrawalCredentials(withdrawalCredentials, { + from: admin, + }); + await pool.registerValidator(validatorParams[0], { + from: operator, + }); + }); + + it('fails to activate with invalid validator index', async () => { + await expectRevert( + pool.activate(sender1, validatorIndex, { + from: sender1, + }), + 'Pool: validator is not active yet' + ); + }); + + it('fails to activate in paused pool', async () => { + await pool.pause({ from: admin }); + expect(await pool.paused()).equal(true); + + await expectRevert( + pool.activate(sender1, validatorIndex, { + from: sender1, + }), + 'Pausable: paused' + ); + }); + + it('fails to activate not existing deposit', async () => { + await pool.setActivatedValidators(validatorIndex, { + from: admin, + }); + await expectRevert( + pool.activate(sender2, validatorIndex, { + from: sender1, + }), + 'Pool: invalid validator index' + ); + }); + + it('fails to activate deposit amount twice', async () => { + await pool.setActivatedValidators(validatorIndex, { + from: admin, + }); + await pool.activate(sender1, validatorIndex, { + from: sender1, + }); + + await expectRevert( + pool.activate(sender1, validatorIndex, { + from: sender1, + }), + 'Pool: invalid validator index' + ); + }); - await expectRevert( - pool.addDeposit({ + it('activates deposit amount', async () => { + await pool.setActivatedValidators(validatorIndex, { + from: admin, + }); + expect(await pool.canActivate(validatorIndex)).to.equal(true); + let receipt = await pool.activate(sender1, validatorIndex, { from: sender1, - value: ether('1'), - }), - 'Pausable: paused' - ); - await checkCollectorBalance(pool); - await checkPoolCollectedAmount(pool); + }); + await expectEvent(receipt, 'Activated', { + account: sender1, + validatorIndex, + value: depositAmount, + sender: sender1, + }); + totalSupply = totalSupply.add(depositAmount); + + await checkStakedEthToken({ + stakedEthToken, + totalSupply, + account: sender1, + balance: depositAmount, + deposit: depositAmount, + }); + + // check contract balance + await checkCollectorBalance(pool, poolBalance); + }); }); - it('adds deposits for different users', async () => { - // User 1 creates a deposit - let depositAmount1 = getDepositAmount(); - let totalSupply = depositAmount1; - await pool.addDeposit({ - from: sender1, - value: depositAmount1, - }); - await checkStakedEthToken({ - stakedEthToken, - totalSupply: depositAmount1, - account: sender1, - balance: depositAmount1, - deposit: depositAmount1, - }); - - // User 2 creates a deposit - let depositAmount2 = getDepositAmount(); - await pool.addDeposit({ - from: sender2, - value: depositAmount2, - }); - totalSupply = totalSupply.add(depositAmount2); - await checkStakedEthToken({ - stakedEthToken, - totalSupply, - account: sender2, - balance: depositAmount2, - deposit: depositAmount2, - }); - - // check contract balance - await checkCollectorBalance(pool, totalSupply); - await checkPoolCollectedAmount(pool, totalSupply); + describe('activating multiple', () => { + let validatorIndex1, validatorIndex2, depositAmount; + + beforeEach(async () => { + await pool.setPendingValidatorsLimit('1', { from: admin }); // 0.01 % + await pool.setMinActivatingDeposit(ether('0.01'), { from: admin }); + + depositAmount = ether('32'); + await pool.addDeposit({ + from: sender3, + value: depositAmount, + }); + validatorIndex1 = activatedValidators.add(new BN(1)); + + await pool.addDeposit({ + from: sender3, + value: depositAmount, + }); + validatorIndex2 = activatedValidators.add(new BN(2)); + + let validators = await Validators.at(contracts.validators); + await validators.addOperator(operator, { from: admin }); + await pool.setWithdrawalCredentials(withdrawalCredentials, { + from: admin, + }); + await pool.registerValidator(validatorParams[0], { + from: operator, + }); + await pool.registerValidator(validatorParams[1], { + from: operator, + }); + }); + + it('fails to activate with invalid validator indexes', async () => { + await expectRevert( + pool.activateMultiple( + sender3, + [validatorIndex1.add(new BN(2)), validatorIndex2.add(new BN(3))], + { + from: sender3, + } + ), + 'Pool: validator is not active yet' + ); + }); + + it('fails to activate in paused pool', async () => { + await pool.pause({ from: admin }); + expect(await pool.paused()).equal(true); + + await expectRevert( + pool.activateMultiple(sender3, [validatorIndex1, validatorIndex2], { + from: sender3, + }), + 'Pausable: paused' + ); + }); + + it('fails to activate not existing deposit', async () => { + await pool.setActivatedValidators(validatorIndex2, { + from: admin, + }); + await expectRevert( + pool.activateMultiple(sender2, [validatorIndex1, validatorIndex2], { + from: sender3, + }), + 'Pool: invalid validator index' + ); + }); + + it('fails to activate multiple deposit amounts twice', async () => { + await pool.setActivatedValidators(validatorIndex2, { + from: admin, + }); + await pool.activateMultiple(sender3, [validatorIndex1, validatorIndex2], { + from: sender3, + }); + + await expectRevert( + pool.activateMultiple(sender3, [validatorIndex1, validatorIndex2], { + from: sender3, + }), + 'Pool: invalid validator index' + ); + }); + + it('activates multiple deposit amounts', async () => { + await pool.setActivatedValidators(validatorIndex2, { + from: admin, + }); + expect(await pool.canActivate(validatorIndex1)).to.equal(true); + expect(await pool.canActivate(validatorIndex2)).to.equal(true); + let receipt = await pool.activateMultiple( + sender3, + [validatorIndex1, validatorIndex2], + { + from: sender3, + } + ); + totalSupply = totalSupply.add(depositAmount.mul(new BN(2))); + + await checkStakedEthToken({ + stakedEthToken, + totalSupply, + account: sender3, + balance: depositAmount.mul(new BN(2)), + deposit: depositAmount.mul(new BN(2)), + }); + + await expectEvent.inTransaction(receipt.tx, Pool, 'Activated', { + account: sender3, + validatorIndex: validatorIndex1, + value: depositAmount, + sender: sender3, + }); + await expectEvent.inTransaction(receipt.tx, Pool, 'Activated', { + account: sender3, + validatorIndex: validatorIndex2, + value: depositAmount, + sender: sender3, + }); + + // check contract balance + await checkCollectorBalance(pool, poolBalance); + }); }); }); diff --git a/test/pool/registerValidator.test.js b/test/pool/registerValidator.test.js index 96251ba0..2a401d46 100644 --- a/test/pool/registerValidator.test.js +++ b/test/pool/registerValidator.test.js @@ -3,13 +3,18 @@ const { expectRevert, expectEvent, ether, + balance, + send, } = require('@openzeppelin/test-helpers'); -const { deployAllContracts } = require('../../deployments'); -const { deployAndInitializeVRC, vrcAbi } = require('../../deployments/vrc'); +const { upgradeContracts } = require('../../deployments'); +const { contractSettings, contracts } = require('../../deployments/settings'); +const { vrcAbi } = require('../../deployments/vrc'); const { checkCollectorBalance, - checkPoolCollectedAmount, - getDepositAmount, + checkValidatorRegistered, + stopImpersonatingAccount, + impersonateAccount, + resetFork, } = require('../utils'); const { validatorParams } = require('./validatorParams'); @@ -21,43 +26,36 @@ const withdrawalCredentials = '0x0072ea0cf49536e3c66c787f705186df9a4378083753ae9536d65b3ad7fcddc4'; const validator = validatorParams[0]; -contract('Pool (register validator)', ([_, ...accounts]) => { - let vrc, pool; - let [admin, operator, sender1, sender2, other] = accounts; +contract('Pool (register validator)', ([operator, sender, other]) => { + const admin = contractSettings.admin; + let pool, vrc; before(async () => { - vrc = new web3.eth.Contract(vrcAbi, await deployAndInitializeVRC()); + vrc = new web3.eth.Contract(vrcAbi, contractSettings.VRC); }); + after(async () => stopImpersonatingAccount(admin)); + beforeEach(async () => { - let { - pool: poolContractAddress, - validators: validatorsContractAddress, - } = await deployAllContracts({ - initialAdmin: admin, - vrcContractAddress: vrc.options.address, - }); - pool = await Pool.at(poolContractAddress); + await impersonateAccount(admin); + await send.ether(other, admin, ether('5')); + await upgradeContracts(); - let validators = await Validators.at(validatorsContractAddress); + pool = await Pool.at(contracts.pool); + let validators = await Validators.at(contracts.validators); await validators.addOperator(operator, { from: admin }); - // register pool - let amount1 = getDepositAmount({ - max: validatorDeposit.div(new BN(2)), - }); + // collect validator deposit + let poolBalance = await balance.current(pool.address); + let depositAmount = validatorDeposit.sub(poolBalance); await pool.addDeposit({ - from: sender1, - value: amount1, - }); - - let amount2 = validatorDeposit.sub(amount1); - await pool.addDeposit({ - from: sender2, - value: amount2, + from: sender, + value: depositAmount, }); }); + afterEach(async () => resetFork()); + it('fails to register validator with callers other than operator', async () => { await expectRevert( pool.registerValidator(validator, { @@ -65,8 +63,6 @@ contract('Pool (register validator)', ([_, ...accounts]) => { }), 'Pool: access denied' ); - await checkCollectorBalance(pool, validatorDeposit); - await checkPoolCollectedAmount(pool, validatorDeposit); }); it('fails to register validator with paused pool', async () => { @@ -79,31 +75,6 @@ contract('Pool (register validator)', ([_, ...accounts]) => { }), 'Pausable: paused' ); - await checkCollectorBalance(pool, validatorDeposit); - await checkPoolCollectedAmount(pool, validatorDeposit); - }); - - it('not admin fails to update withdrawal credentials', async () => { - await expectRevert( - pool.setWithdrawalCredentials(withdrawalCredentials, { - from: other, - }), - 'OwnablePausable: access denied' - ); - await checkCollectorBalance(pool, validatorDeposit); - await checkPoolCollectedAmount(pool, validatorDeposit); - }); - - it('admin can update withdrawal credentials', async () => { - let receipt = await pool.setWithdrawalCredentials(withdrawalCredentials, { - from: admin, - }); - - await expectEvent(receipt, 'WithdrawalCredentialsUpdated', { - withdrawalCredentials, - }); - await checkCollectorBalance(pool, validatorDeposit); - await checkPoolCollectedAmount(pool, validatorDeposit); }); it('fails to register validator with used public key', async () => { @@ -113,7 +84,7 @@ contract('Pool (register validator)', ([_, ...accounts]) => { // create new deposit await pool.addDeposit({ - from: sender1, + from: sender, value: validatorDeposit, }); @@ -130,7 +101,6 @@ contract('Pool (register validator)', ([_, ...accounts]) => { 'Validators: invalid public key' ); await checkCollectorBalance(pool, validatorDeposit); - await checkPoolCollectedAmount(pool, validatorDeposit); }); it('fails to register validator when validator deposit amount is not collect', async () => { @@ -143,15 +113,13 @@ contract('Pool (register validator)', ([_, ...accounts]) => { from: operator, }); - await expectRevert( + await expectRevert.unspecified( pool.registerValidator(validatorParams[1], { from: operator, - }), - 'Pool: insufficient amount' + }) ); await checkCollectorBalance(pool, new BN(0)); - await checkPoolCollectedAmount(pool, new BN(0)); }); it('registers validator', async () => { @@ -164,7 +132,7 @@ contract('Pool (register validator)', ([_, ...accounts]) => { for (let i = 1; i < validatorParams.length; i++) { await pool.addDeposit({ - from: sender1, + from: sender, value: validatorDeposit, }); totalAmount = totalAmount.add(validatorDeposit); @@ -172,7 +140,6 @@ contract('Pool (register validator)', ([_, ...accounts]) => { // check balance increased correctly await checkCollectorBalance(pool, totalAmount); - await checkPoolCollectedAmount(pool, totalAmount); // register validators for (let i = 0; i < validatorParams.length; i++) { @@ -184,10 +151,17 @@ contract('Pool (register validator)', ([_, ...accounts]) => { operator, }); totalAmount = totalAmount.sub(validatorDeposit); + await checkValidatorRegistered({ + vrc, + operator, + transaction: receipt.tx, + pubKey: validatorParams[i].publicKey, + withdrawalCredentials, + signature: validatorParams[i].signature, + }); } // check balance empty await checkCollectorBalance(pool); - await checkPoolCollectedAmount(pool); }); }); diff --git a/test/pool/settings.test.js b/test/pool/settings.test.js new file mode 100644 index 00000000..861be43e --- /dev/null +++ b/test/pool/settings.test.js @@ -0,0 +1,185 @@ +const { expect } = require('chai'); +const { + send, + ether, + expectRevert, + expectEvent, + BN, +} = require('@openzeppelin/test-helpers'); +const { + stopImpersonatingAccount, + impersonateAccount, + resetFork, + setActivatedValidators, + getOracleAccounts, +} = require('../utils'); +const { upgradeContracts } = require('../../deployments'); +const { contractSettings, contracts } = require('../../deployments/settings'); + +const Pool = artifacts.require('Pool'); +const Oracles = artifacts.require('Oracles'); +const RewardEthToken = artifacts.require('RewardEthToken'); + +contract('Pool (settings)', ([anyone]) => { + const admin = contractSettings.admin; + let pool, oracles, oracleAccounts, rewardEthToken; + + after(async () => stopImpersonatingAccount(admin)); + + beforeEach(async () => { + // update contract settings before upgrade + contractSettings.activatedValidators = '10'; + contractSettings.pendingValidators = '2'; + + await impersonateAccount(admin); + await send.ether(anyone, admin, ether('5')); + await upgradeContracts(); + pool = await Pool.at(contracts.pool); + + oracles = await Oracles.at(contracts.oracles); + oracleAccounts = await getOracleAccounts({ oracles }); + rewardEthToken = await RewardEthToken.at(contracts.rewardEthToken); + }); + + afterEach(async () => resetFork()); + + describe('min activating deposit', () => { + it('not admin fails to set min activating deposit', async () => { + await expectRevert( + pool.setMinActivatingDeposit(ether('10'), { + from: anyone, + }), + 'OwnablePausable: access denied' + ); + }); + + it('admin can set min activating deposit', async () => { + let minActivatingDeposit = ether('10'); + let receipt = await pool.setMinActivatingDeposit(minActivatingDeposit, { + from: admin, + }); + await expectEvent(receipt, 'MinActivatingDepositUpdated', { + minActivatingDeposit, + sender: admin, + }); + expect(await pool.minActivatingDeposit()).to.bignumber.equal( + minActivatingDeposit + ); + }); + }); + + describe('pending validators limit', () => { + it('not admin fails to set pending validators limit', async () => { + await expectRevert( + pool.setPendingValidatorsLimit('1000', { + from: anyone, + }), + 'OwnablePausable: access denied' + ); + }); + + it('admin can set pending validators limit', async () => { + let pendingValidatorsLimit = '1000'; + let receipt = await pool.setPendingValidatorsLimit( + pendingValidatorsLimit, + { + from: admin, + } + ); + await expectEvent(receipt, 'PendingValidatorsLimitUpdated', { + pendingValidatorsLimit, + sender: admin, + }); + expect(await pool.pendingValidatorsLimit()).to.bignumber.equal( + pendingValidatorsLimit + ); + }); + + it('fails to set invalid pending validators limit', async () => { + await expectRevert( + pool.setPendingValidatorsLimit(10000, { + from: admin, + }), + 'Pool: invalid limit' + ); + }); + }); + + describe('activated validators', () => { + it('not oracles contract or admin fails to set activated validators', async () => { + await expectRevert( + pool.setActivatedValidators('10', { + from: anyone, + }), + 'Pool: access denied' + ); + }); + + it('admin can override activated validators', async () => { + let activatedValidators = new BN( + contractSettings.activatedValidators + ).add(new BN(contractSettings.pendingValidators)); + let receipt = await pool.setActivatedValidators(activatedValidators, { + from: admin, + }); + expectEvent(receipt, 'ActivatedValidatorsUpdated', { + activatedValidators, + }); + expect(await pool.activatedValidators()).to.bignumber.equal( + activatedValidators + ); + }); + + it('oracles contract can set activated validators', async () => { + let activatedValidators = new BN( + contractSettings.activatedValidators + ).add(new BN(contractSettings.pendingValidators)); + let receipt = await setActivatedValidators({ + pool, + rewardEthToken, + activatedValidators, + oracleAccounts, + oracles, + }); + await expectEvent.inTransaction( + receipt.tx, + Pool, + 'ActivatedValidatorsUpdated', + { + activatedValidators, + sender: contracts.oracles, + } + ); + expect(await pool.activatedValidators()).to.bignumber.equal( + activatedValidators + ); + }); + }); + + describe('withdrawal credentials', () => { + const withdrawalCredentials = + '0x0072ea0cf49536e3c66c787f705186df9a4378083753ae9536d65b3ad7fcddc4'; + + it('not admin fails to update withdrawal credentials', async () => { + await expectRevert( + pool.setWithdrawalCredentials(withdrawalCredentials, { + from: anyone, + }), + 'OwnablePausable: access denied' + ); + }); + + it('admin can update withdrawal credentials', async () => { + let receipt = await pool.setWithdrawalCredentials(withdrawalCredentials, { + from: admin, + }); + + await expectEvent(receipt, 'WithdrawalCredentialsUpdated', { + withdrawalCredentials, + }); + expect(await pool.withdrawalCredentials()).to.equal( + withdrawalCredentials + ); + }); + }); +}); diff --git a/test/pool/upgrading.test.js b/test/pool/upgrading.test.js new file mode 100644 index 00000000..8dd80b30 --- /dev/null +++ b/test/pool/upgrading.test.js @@ -0,0 +1,77 @@ +const { expect } = require('chai'); +const { expectRevert, send, ether } = require('@openzeppelin/test-helpers'); +const { + stopImpersonatingAccount, + impersonateAccount, + resetFork, +} = require('../utils'); +const { contractSettings, contracts } = require('../../deployments/settings'); +const { upgradeContracts } = require('../../deployments'); + +const Pool = artifacts.require('Pool'); + +contract('Pool (upgrading)', ([sender]) => { + const admin = contractSettings.admin; + let pool; + + after(async () => stopImpersonatingAccount(admin)); + + beforeEach(async () => { + await impersonateAccount(admin); + await send.ether(sender, admin, ether('5')); + await upgradeContracts(); + pool = await Pool.at(contracts.pool); + + expect(await pool.activatedValidators()).to.bignumber.equal( + contractSettings.activatedValidators + ); + expect(await pool.pendingValidatorsLimit()).to.bignumber.equal( + contractSettings.pendingValidatorsLimit + ); + }); + + afterEach(async () => resetFork()); + + it('fails to upgrade with not admin privilege', async () => { + await expectRevert( + pool.upgrade( + contracts.oracles, + contractSettings.activatedValidators, + contractSettings.pendingValidators, + contractSettings.minActivatingDeposit, + contractSettings.pendingValidatorsLimit, + { from: sender } + ), + 'OwnablePausable: access denied' + ); + }); + + it('fails to upgrade when not paused', async () => { + await expectRevert( + pool.upgrade( + contracts.oracles, + contractSettings.activatedValidators, + contractSettings.pendingValidators, + contractSettings.minActivatingDeposit, + contractSettings.pendingValidatorsLimit, + { from: admin } + ), + 'Pausable: not paused' + ); + }); + + it('fails to upgrade twice', async () => { + await pool.pause({ from: admin }); + await expectRevert( + pool.upgrade( + contracts.oracles, + contractSettings.activatedValidators, + contractSettings.pendingValidators, + contractSettings.minActivatingDeposit, + contractSettings.pendingValidatorsLimit, + { from: admin } + ), + 'Pool: already upgraded' + ); + }); +}); diff --git a/test/solos/addDeposit.test.js b/test/solos/addDeposit.test.js index 34295fec..e80c212e 100644 --- a/test/solos/addDeposit.test.js +++ b/test/solos/addDeposit.test.js @@ -4,9 +4,17 @@ const { ether, constants, expectRevert, + send, } = require('@openzeppelin/test-helpers'); -const { deployAllContracts } = require('../../deployments'); -const { checkCollectorBalance, checkSoloDepositAdded } = require('../utils'); +const { upgradeContracts } = require('../../deployments'); +const { contractSettings, contracts } = require('../../deployments/settings'); +const { + stopImpersonatingAccount, + impersonateAccount, + resetFork, + checkCollectorBalance, + checkSoloDepositAdded, +} = require('../utils'); const Solos = artifacts.require('Solos'); @@ -14,17 +22,23 @@ const validatorDeposit = ether('32'); const withdrawalCredentials = '0x00fd1759df8cf0dfa07a7d0b9083c7527af46d8b87c33305cee15165c49d5061'; -contract('Solos (add deposit)', ([_, ...accounts]) => { +contract('Solos (add deposit)', ([sender1, sender2]) => { + const admin = contractSettings.admin; let solos; - let [admin, sender1, sender2] = accounts; + + after(async () => stopImpersonatingAccount(admin)); beforeEach(async () => { - let { solos: solosContractAddress } = await deployAllContracts({ - initialAdmin: admin, - }); - solos = await Solos.at(solosContractAddress); + await impersonateAccount(admin); + await send.ether(sender1, admin, ether('5')); + + await upgradeContracts(); + + solos = await Solos.at(contracts.solos); }); + afterEach(async () => resetFork()); + it('fails to add a deposit with invalid withdrawal credentials', async () => { await expectRevert( solos.addDeposit(constants.ZERO_BYTES32, { diff --git a/test/solos/cancelDeposit.test.js b/test/solos/cancelDeposit.test.js index d8704cea..7a6e0e0e 100644 --- a/test/solos/cancelDeposit.test.js +++ b/test/solos/cancelDeposit.test.js @@ -6,10 +6,17 @@ const { time, constants, balance, + send, } = require('@openzeppelin/test-helpers'); -const { deployAllContracts } = require('../../deployments'); -const { deployAndInitializeVRC, vrcAbi } = require('../../deployments/vrc'); -const { checkCollectorBalance, checkSolo } = require('../utils'); +const { upgradeContracts } = require('../../deployments'); +const { contractSettings, contracts } = require('../../deployments/settings'); +const { + checkCollectorBalance, + checkSolo, + stopImpersonatingAccount, + impersonateAccount, + resetFork, +} = require('../utils'); const { validatorParams } = require('./validatorParams'); const Solos = artifacts.require('Solos'); @@ -19,26 +26,22 @@ const validatorDeposit = ether('32'); const cancelLockDuration = 86400; // 1 day const { withdrawalCredentials } = validatorParams[0]; -contract('Solos (cancel deposit)', ([_, ...accounts]) => { - let solos, soloId, vrc; - let [admin, operator, sender, anyone] = accounts; +contract('Solos (cancel deposit)', ([operator, sender, anyone]) => { + const admin = contractSettings.admin; + let solos, soloId; - before(async () => { - vrc = new web3.eth.Contract(vrcAbi, await deployAndInitializeVRC()); - }); + after(async () => stopImpersonatingAccount(admin)); beforeEach(async () => { - let { - solos: solosContractAddress, - validators: validatorsContractAddress, - } = await deployAllContracts({ - initialAdmin: admin, - vrcContractAddress: vrc.options.address, - }); - solos = await Solos.at(solosContractAddress); + await impersonateAccount(admin); + await send.ether(sender, admin, ether('5')); - let validators = await Validators.at(validatorsContractAddress); + await upgradeContracts(); + + let validators = await Validators.at(contracts.validators); await validators.addOperator(operator, { from: admin }); + + solos = await Solos.at(contracts.solos); await solos.setCancelLockDuration(cancelLockDuration, { from: admin, }); @@ -55,6 +58,8 @@ contract('Solos (cancel deposit)', ([_, ...accounts]) => { ); }); + afterEach(async () => resetFork()); + it('fails to cancel a deposit with invalid withdrawal credentials', async () => { await expectRevert( solos.cancelDeposit(constants.ZERO_BYTES32, validatorDeposit, { diff --git a/test/solos/registerValidator.test.js b/test/solos/registerValidator.test.js index dcd45fac..86eefc7e 100644 --- a/test/solos/registerValidator.test.js +++ b/test/solos/registerValidator.test.js @@ -4,13 +4,18 @@ const { expectEvent, constants, ether, + send, } = require('@openzeppelin/test-helpers'); -const { deployAllContracts } = require('../../deployments'); -const { deployAndInitializeVRC, vrcAbi } = require('../../deployments/vrc'); +const { upgradeContracts } = require('../../deployments'); +const { contractSettings, contracts } = require('../../deployments/settings'); +const { vrcAbi } = require('../../deployments/vrc'); const { checkCollectorBalance, checkSolo, checkValidatorRegistered, + stopImpersonatingAccount, + impersonateAccount, + resetFork, } = require('../utils'); const { validatorParams } = require('./validatorParams'); @@ -21,25 +26,24 @@ const validatorPrice = ether('10'); const validatorDeposit = ether('32'); const validator = validatorParams[0]; -contract('Solos (register validator)', ([_, ...accounts]) => { +contract('Solos (register validator)', ([operator, sender, other]) => { + const admin = contractSettings.admin; let vrc, solos, soloId; - let [admin, operator, sender, other] = accounts; before(async () => { - vrc = new web3.eth.Contract(vrcAbi, await deployAndInitializeVRC()); + vrc = new web3.eth.Contract(vrcAbi, contractSettings.VRC); }); + after(async () => stopImpersonatingAccount(admin)); + beforeEach(async () => { - let { - solos: solosContractAddress, - validators: validatorsContractAddress, - } = await deployAllContracts({ - initialAdmin: admin, - vrcContractAddress: vrc.options.address, - }); - solos = await Solos.at(solosContractAddress); + await impersonateAccount(admin); + await send.ether(sender, admin, ether('5')); - let validators = await Validators.at(validatorsContractAddress); + await upgradeContracts(); + + solos = await Solos.at(contracts.solos); + let validators = await Validators.at(contracts.validators); await validators.addOperator(operator, { from: admin }); await solos.setValidatorPrice(validatorPrice, { @@ -58,6 +62,8 @@ contract('Solos (register validator)', ([_, ...accounts]) => { ); }); + afterEach(async () => resetFork()); + it('fails to register validator for invalid solo ID', async () => { let validator = { soloId: constants.ZERO_BYTES32, ...validatorParams[0] }; await expectRevert( diff --git a/test/tokens/RewardEthToken.test.js b/test/tokens/RewardEthToken.test.js index 8f726b40..3d12b721 100644 --- a/test/tokens/RewardEthToken.test.js +++ b/test/tokens/RewardEthToken.test.js @@ -5,62 +5,80 @@ const { BN, ether, constants, - time, + send, } = require('@openzeppelin/test-helpers'); +const { upgradeContracts } = require('../../deployments'); +const { contractSettings, contracts } = require('../../deployments/settings'); const { - checkStakedEthToken, + stopImpersonatingAccount, + impersonateAccount, + resetFork, checkRewardEthToken, - deployTokens, + setTotalRewards, + getOracleAccounts, } = require('../utils'); -const validatorDeposit = ether('32'); +const StakedEthToken = artifacts.require('StakedEthToken'); +const RewardEthToken = artifacts.require('RewardEthToken'); +const Pool = artifacts.require('Pool'); +const Oracles = artifacts.require('Oracles'); const maintainerFee = new BN(1000); -contract('RewardEthToken', ([_, ...accounts]) => { - let stakedEthToken, rewardEthToken; - let [ - poolContractAddress, - admin, +contract('RewardEthToken', ([sender, ...accounts]) => { + const admin = contractSettings.admin; + let stakedEthToken, + rewardEthToken, maintainer, - oraclesContractAddress, - ...otherAccounts - ] = accounts; + totalSupply, + pool, + oracles, + oracleAccounts; - beforeEach(async () => { - [rewardEthToken, stakedEthToken] = await deployTokens({ - adminAddress: admin, - oraclesContractAddress, - poolContractAddress, - }); + after(async () => stopImpersonatingAccount(admin)); + beforeEach(async () => { + await impersonateAccount(admin); + await send.ether(sender, admin, ether('5')); + + await upgradeContracts(); + + stakedEthToken = await StakedEthToken.at(contracts.stakedEthToken); + rewardEthToken = await RewardEthToken.at(contracts.rewardEthToken); + pool = await Pool.at(contracts.pool); + oracles = await Oracles.at(contracts.oracles); + oracleAccounts = await getOracleAccounts({ oracles }); + maintainer = await rewardEthToken.maintainer(); + totalSupply = await rewardEthToken.totalSupply(); await rewardEthToken.setMaintainer(maintainer, { from: admin }); await rewardEthToken.setMaintainerFee(maintainerFee, { from: admin }); }); + afterEach(async () => resetFork()); + describe('admin actions', () => { it('not admin fails to update maintainer address', async () => { await expectRevert( - rewardEthToken.setMaintainer(otherAccounts[0], { - from: otherAccounts[0], + rewardEthToken.setMaintainer(sender, { + from: sender, }), 'OwnablePausable: access denied' ); }); it('admin can update maintainer address', async () => { - let receipt = await rewardEthToken.setMaintainer(otherAccounts[0], { + let receipt = await rewardEthToken.setMaintainer(sender, { from: admin, }); await expectEvent(receipt, 'MaintainerUpdated', { - maintainer: otherAccounts[0], + maintainer: sender, }); }); it('not admin fails to update maintainer fee', async () => { await expectRevert( rewardEthToken.setMaintainerFee(9999, { - from: otherAccounts[0], + from: sender, }), 'OwnablePausable: access denied' ); @@ -90,361 +108,76 @@ contract('RewardEthToken', ([_, ...accounts]) => { it('anyone cannot update rewards', async () => { await expectRevert( rewardEthToken.updateTotalRewards(ether('10'), { - from: otherAccounts[0], + from: sender, }), 'RewardEthToken: access denied' ); await checkRewardEthToken({ rewardEthToken, - totalSupply: new BN(0), - account: otherAccounts[0], + totalSupply, + account: sender, balance: new BN(0), - reward: new BN(0), }); }); it('oracles can update rewards', async () => { - let deposit = ether('32'); - await stakedEthToken.mint(otherAccounts[0], deposit, { - from: poolContractAddress, - }); - let newTotalRewards = ether('10'); - let maintainerReward = newTotalRewards - .mul(new BN(maintainerFee)) - .div(new BN(10000)); - let userReward = newTotalRewards.sub(maintainerReward); - - let receipt = await rewardEthToken.updateTotalRewards(newTotalRewards, { - from: oraclesContractAddress, - }); - - expectEvent(receipt, 'RewardsUpdated', { - periodRewards: newTotalRewards, + let prevTotalRewards = await rewardEthToken.totalRewards(); + let newTotalRewards = prevTotalRewards.add(ether('10')); + let receipt = await setTotalRewards({ totalRewards: newTotalRewards, - rewardPerToken: userReward.mul(ether('1')).div(deposit), - }); - - await checkRewardEthToken({ - rewardEthToken, - totalSupply: newTotalRewards, - account: otherAccounts[0], - balance: userReward, - reward: userReward, - }); - await checkRewardEthToken({ - rewardEthToken, - account: maintainer, - balance: maintainerReward, - reward: maintainerReward, - }); - }); - - it('calculates account rewards correctly', async () => { - let testCases = [ - { - totalRewards: ether('0.330183305588444444'), - maintainerReward: ether('0.033018330558844444'), - users: [ - { deposit: ether('2.04'), reward: ether('0.018944267158137') }, - { deposit: ether('3.771'), reward: ether('0.035019035026144425') }, - { deposit: ether('3.782'), reward: ether('0.03512118548631085') }, - { deposit: ether('3.661'), reward: ether('0.033997530424480175') }, - { deposit: ether('4.513'), reward: ether('0.041909547884643275') }, - { deposit: ether('4.166'), reward: ether('0.03868716518666605') }, - { deposit: ether('1.414'), reward: ether('0.01313097733412045') }, - { deposit: ether('0.991'), reward: ether('0.009202827820447925') }, - { deposit: ether('3.043'), reward: ether('0.028258531844221025') }, - { deposit: ether('4.382'), reward: ether('0.04069302876811585') }, - { deposit: ether('0.237'), reward: ether('0.002200878096312975') }, - ], - }, - { - totalRewards: ether('2.145744568757666688'), - maintainerReward: ether('0.214574456875766668'), - users: Array(validatorDeposit.div(ether('4')).toNumber()).fill({ - deposit: ether('4'), - reward: ether('0.2413962639852375'), - }), - }, - { - totalRewards: ether('1.187486063937777777'), - maintainerReward: ether('0.118748606393777777'), - users: [{ deposit: ether('32.0'), reward: ether('1.0687374575440') }], - }, - ]; - - for (const { totalRewards, maintainerReward, users } of testCases) { - // redeploy tokens - [rewardEthToken, stakedEthToken] = await deployTokens({ - adminAddress: admin, - oraclesContractAddress, - poolContractAddress, - }); - await rewardEthToken.setMaintainer(maintainer, { from: admin }); - await rewardEthToken.setMaintainerFee(maintainerFee, { from: admin }); - - // mint deposits - for (let i = 0; i < users.length; i++) { - await stakedEthToken.mint(otherAccounts[i], users[i].deposit, { - from: poolContractAddress, - }); - } - - // update rewards - await rewardEthToken.updateTotalRewards(totalRewards, { - from: oraclesContractAddress, - }); - - // check maintainer reward - await checkRewardEthToken({ - rewardEthToken, - totalSupply: totalRewards, - account: maintainer, - balance: maintainerReward, - reward: maintainerReward, - }); - - // check rewards and deposits - for (let i = 0; i < users.length; i++) { - let { reward, deposit } = users[i]; - await checkRewardEthToken({ - rewardEthToken, - account: otherAccounts[i], - balance: reward, - reward: reward, - }); - - await checkStakedEthToken({ - stakedEthToken, - totalSupply: validatorDeposit, - account: otherAccounts[i], - balance: deposit, - deposit, - }); - } - } - }); - - it('calculates rewards and deposits correctly with different actions', async () => { - let tests = [ - // initial deposits - [ - { deposit: ether('5'), reward: ether('0') }, - { deposit: ether('10'), reward: ether('0') }, - { deposit: ether('25'), reward: ether('0') }, - ], - // user1 transfers 4 sETH2 to user2 - [ - { deposit: ether('5'), reward: ether('0') }, - { deposit: ether('6'), reward: ether('0') }, - { deposit: ether('29'), reward: ether('0') }, - ], - // period rewards: 0.773174861417694153 - // maintainer reward: 0.077317486141769415 - // total rewards: 0.773174861417694153 - // reward rate: 0.017396434381898118 - [ - { deposit: ether('5'), reward: ether('0.086982171909490590') }, - { deposit: ether('6'), reward: ether('0.104378606291388708') }, - { - deposit: ether('29'), - reward: ether('0.504496597075045422'), - }, - ], - // user2 transfer 6 sETH2 to user0 - // user1 transfers 0.104378606291388710 rETH2 to user2 - // user3 creates new deposit with 4 sETH2 - [ - { - deposit: ether('11'), - reward: ether('0.086982171909490590'), - }, - { deposit: ether('6'), reward: ether('0') }, - { deposit: ether('23'), reward: ether('0.60887520336643413') }, - { deposit: ether('4'), reward: ether('0') }, - ], - ]; - - // 0. users make deposits - let totalDeposits = new BN(0); - for (let i = 0; i < tests[0].length; i++) { - let deposit = tests[0][i].deposit; - let reward = tests[0][i].reward; - - totalDeposits = totalDeposits.add(deposit); - await stakedEthToken.mint(otherAccounts[i], deposit, { - from: poolContractAddress, - }); - - // perform checks - await checkRewardEthToken({ - rewardEthToken, - totalSupply: new BN(0), - account: otherAccounts[i], - balance: reward, - reward, - }); - await checkStakedEthToken({ - stakedEthToken, - totalSupply: totalDeposits, - account: otherAccounts[i], - balance: deposit, - deposit, - }); - } - - // 1. user1 transfers 4 sETH2 to user2 - await stakedEthToken.transfer(otherAccounts[2], ether('4'), { - from: otherAccounts[1], - }); - for (let i = 0; i < tests[1].length; i++) { - let deposit = tests[1][i].deposit; - let reward = tests[1][i].reward; - - // perform checks - await checkRewardEthToken({ - rewardEthToken, - totalSupply: new BN(0), - account: otherAccounts[i], - balance: reward, - reward: reward, - }); - await checkStakedEthToken({ - stakedEthToken, - totalSupply: totalDeposits, - account: otherAccounts[i], - balance: deposit, - deposit, - }); - } - - // 2. period reward: 0.773174861417694153 arrives - let periodRewards = ether('0.773174861417694153'); - let maintainerReward = ether('0.077317486141769415'); - let totalRewards = periodRewards; - let rewardPerToken = ether('0.017396434381898118'); - let receipt = await rewardEthToken.updateTotalRewards(totalRewards, { - from: oraclesContractAddress, - }); - await time.increase(time.duration.minutes(1)); - expectEvent(receipt, 'RewardsUpdated', { - periodRewards, - totalRewards, - rewardPerToken, - }); - - await checkRewardEthToken({ rewardEthToken, - totalSupply: totalRewards, - account: maintainer, - balance: maintainerReward, - reward: maintainerReward, - }); - - for (let i = 0; i < tests[2].length; i++) { - let deposit = tests[2][i].deposit; - let reward = tests[2][i].reward; - - // perform checks - await checkRewardEthToken({ - rewardEthToken, - totalSupply: totalRewards, - account: otherAccounts[i], - balance: reward, - reward: reward, - }); - await checkStakedEthToken({ - stakedEthToken, - totalSupply: totalDeposits, - account: otherAccounts[i], - balance: deposit, - deposit, - }); - } - - // 3. user2 transfer 6 sETH2 to user0 - await stakedEthToken.transfer(otherAccounts[0], ether('6'), { - from: otherAccounts[2], - }); - // user1 transfers 0.104378606291388708 rETH2 to user2 - await rewardEthToken.transfer( - otherAccounts[2], - ether('0.104378606291388708'), - { - from: otherAccounts[1], - } - ); - // user3 creates new deposit with 4 sETH2 - await stakedEthToken.mint(otherAccounts[3], ether('4'), { - from: poolContractAddress, + oracles, + oracleAccounts, + pool, }); - totalDeposits = totalDeposits.add(ether('4')); - - for (let i = 0; i < tests[3].length; i++) { - let deposit = tests[3][i].deposit; - let reward = tests[3][i].reward; - - // perform checks - await checkRewardEthToken({ - rewardEthToken, - totalSupply: totalRewards, - account: otherAccounts[i], - balance: reward, - reward: reward, - }); - await checkStakedEthToken({ - stakedEthToken, - totalSupply: totalDeposits, - account: otherAccounts[i], - balance: deposit, - deposit, - }); - } - - // 5. user3 transfers 3.903576912806307183 sETH2 to user0 - await stakedEthToken.transfer( - otherAccounts[0], - ether('3.903576912806307183'), + await expectEvent.inTransaction( + receipt.tx, + RewardEthToken, + 'RewardsUpdated', { - from: otherAccounts[3], - } - ); - - // user2 transfers 0.054442452002700437 rETH2 to user3 - await rewardEthToken.transfer( - otherAccounts[3], - ether('0.054442452002700437'), - { - from: otherAccounts[2], + periodRewards: newTotalRewards.sub(prevTotalRewards), + totalRewards: newTotalRewards, } ); }); }); describe('transfer', () => { - let value1 = ether('4'); - let value2 = ether('5'); - let maintainerReward = ether('1'); - let totalRewards = value1.add(value2).add(maintainerReward); - let [sender1, sender2] = otherAccounts; + const stakedAmount1 = ether('4'); + const stakedAmount2 = ether('5'); + const [sender1, sender2] = accounts; + let rewardAmount1, rewardAmount2; beforeEach(async () => { - await stakedEthToken.mint(sender1, value1, { - from: poolContractAddress, + await pool.setMinActivatingDeposit(stakedAmount2.add(ether('1')), { + from: admin, + }); + await pool.addDeposit({ + from: sender1, + value: stakedAmount1, }); - await stakedEthToken.mint(sender2, value2, { - from: poolContractAddress, + await pool.addDeposit({ + from: sender2, + value: stakedAmount2, }); - await rewardEthToken.updateTotalRewards(totalRewards, { - from: oraclesContractAddress, + totalSupply = (await rewardEthToken.totalSupply()).add(ether('10')); + await setTotalRewards({ + totalRewards: totalSupply, + rewardEthToken, + pool, + oracles, + oracleAccounts, }); - await time.increase(time.duration.minutes(1)); + + rewardAmount1 = await rewardEthToken.balanceOf(sender1); + rewardAmount2 = await rewardEthToken.balanceOf(sender2); + expect(rewardAmount2.gt(rewardAmount1)).to.equal(true); }); it('cannot transfer to zero address', async () => { await expectRevert( - rewardEthToken.transfer(constants.ZERO_ADDRESS, value1, { + rewardEthToken.transfer(constants.ZERO_ADDRESS, stakedAmount1, { from: sender1, }), 'RewardEthToken: invalid receiver' @@ -452,27 +185,30 @@ contract('RewardEthToken', ([_, ...accounts]) => { await checkRewardEthToken({ rewardEthToken, - totalSupply: totalRewards, + totalSupply, account: sender1, - balance: value1, - reward: value1, + balance: rewardAmount1, }); }); it('cannot transfer from zero address', async () => { await expectRevert( - rewardEthToken.transferFrom(constants.ZERO_ADDRESS, sender2, value1, { - from: sender1, - }), + rewardEthToken.transferFrom( + constants.ZERO_ADDRESS, + sender2, + rewardAmount1, + { + from: sender1, + } + ), 'RewardEthToken: invalid sender' ); await checkRewardEthToken({ rewardEthToken, - totalSupply: totalRewards, + totalSupply, account: sender1, - balance: value1, - reward: value1, + balance: rewardAmount1, }); }); @@ -489,10 +225,9 @@ contract('RewardEthToken', ([_, ...accounts]) => { await checkRewardEthToken({ rewardEthToken, - totalSupply: totalRewards, + totalSupply, account: sender1, - balance: value1, - reward: value1, + balance: rewardAmount1, }); }); @@ -501,7 +236,7 @@ contract('RewardEthToken', ([_, ...accounts]) => { expect(await rewardEthToken.paused()).equal(true); await expectRevert( - rewardEthToken.transfer(sender2, value1, { + rewardEthToken.transfer(sender2, rewardAmount1, { from: sender1, }), 'Pausable: paused' @@ -509,17 +244,16 @@ contract('RewardEthToken', ([_, ...accounts]) => { await checkRewardEthToken({ rewardEthToken, - totalSupply: totalRewards, + totalSupply, account: sender1, - balance: value1, - reward: value1, + balance: rewardAmount1, }); await rewardEthToken.unpause({ from: admin }); }); it('cannot transfer amount bigger than balance', async () => { await expectRevert( - rewardEthToken.transfer(sender2, value1.add(ether('1')), { + rewardEthToken.transfer(sender2, stakedAmount1.add(ether('1')), { from: sender1, }), 'RewardEthToken: invalid amount' @@ -527,38 +261,35 @@ contract('RewardEthToken', ([_, ...accounts]) => { await checkRewardEthToken({ rewardEthToken, - totalSupply: totalRewards, + totalSupply, account: sender1, - balance: value1, - reward: value1, + balance: rewardAmount1, }); }); it('can transfer rETH2 tokens to different account', async () => { - let receipt = await rewardEthToken.transfer(sender2, value1, { + let receipt = await rewardEthToken.transfer(sender2, rewardAmount1, { from: sender1, }); expectEvent(receipt, 'Transfer', { from: sender1, to: sender2, - value: value1, + value: rewardAmount1, }); await checkRewardEthToken({ rewardEthToken, - totalSupply: totalRewards, + totalSupply, account: sender1, balance: new BN(0), - deposit: new BN(0), }); await checkRewardEthToken({ rewardEthToken, - totalSupply: totalRewards, + totalSupply, account: sender2, - balance: value1.add(value2), - deposit: value2, + balance: rewardAmount1.add(rewardAmount2), }); }); }); diff --git a/test/tokens/StakedEthToken.test.js b/test/tokens/StakedEthToken.test.js index 913cbb67..2c8d204d 100644 --- a/test/tokens/StakedEthToken.test.js +++ b/test/tokens/StakedEthToken.test.js @@ -5,46 +5,40 @@ const { BN, ether, constants, + send, } = require('@openzeppelin/test-helpers'); const { - deployStakedEthToken, - deployRewardEthToken, - initializeStakedEthToken, - initializeRewardEthToken, -} = require('../../deployments/tokens'); -const { checkStakedEthToken } = require('../utils'); + impersonateAccount, + stopImpersonatingAccount, + resetFork, + checkStakedEthToken, +} = require('../utils'); +const { upgradeContracts } = require('../../deployments'); +const { contractSettings, contracts } = require('../../deployments/settings'); const StakedEthToken = artifacts.require('StakedEthToken'); +const Pool = artifacts.require('Pool'); -contract('StakedEthToken', ([_, ...accounts]) => { - let stakedEthToken; - let [ - poolContractAddress, - admin, - oraclesContractAddress, - sender1, - sender2, - ] = accounts; +contract('StakedEthToken', ([sender1, sender2]) => { + const admin = contractSettings.admin; + let stakedEthToken, pool, totalSupply; beforeEach(async () => { - const stakedEthTokenContractAddress = await deployStakedEthToken(); - const rewardEthTokenContractAddress = await deployRewardEthToken(); - await initializeStakedEthToken( - stakedEthTokenContractAddress, - admin, - rewardEthTokenContractAddress, - poolContractAddress - ); - await initializeRewardEthToken( - rewardEthTokenContractAddress, - admin, - stakedEthTokenContractAddress, - oraclesContractAddress - ); - - stakedEthToken = await StakedEthToken.at(stakedEthTokenContractAddress); + await impersonateAccount(admin); + await send.ether(sender1, admin, ether('5')); + + await upgradeContracts(); + + stakedEthToken = await StakedEthToken.at(contracts.stakedEthToken); + pool = await Pool.at(contracts.pool); + + totalSupply = await stakedEthToken.totalSupply(); }); + after(async () => stopImpersonatingAccount(admin)); + + afterEach(async () => resetFork()); + describe('mint', () => { it('anyone cannot mint sETH2 tokens', async () => { await expectRevert( @@ -55,41 +49,26 @@ contract('StakedEthToken', ([_, ...accounts]) => { ); await checkStakedEthToken({ stakedEthToken, - totalSupply: new BN(0), + totalSupply, account: sender1, balance: new BN(0), deposit: new BN(0), }); }); - - it('pool can mint sETH2 tokens', async () => { - let value = ether('10'); - let receipt = await stakedEthToken.mint(sender1, value, { - from: poolContractAddress, - }); - expectEvent(receipt, 'Transfer', { - from: constants.ZERO_ADDRESS, - to: sender1, - value, - }); - - await checkStakedEthToken({ - stakedEthToken, - totalSupply: value, - account: sender1, - balance: value, - deposit: value, - }); - }); }); describe('transfer', () => { let value = ether('10'); beforeEach(async () => { - await stakedEthToken.mint(sender1, value, { - from: poolContractAddress, + await pool.setMinActivatingDeposit(value.add(ether('1')), { + from: admin, + }); + await pool.addDeposit({ + from: sender1, + value, }); + totalSupply = totalSupply.add(value); }); it('cannot transfer to zero address', async () => { @@ -102,7 +81,7 @@ contract('StakedEthToken', ([_, ...accounts]) => { await checkStakedEthToken({ stakedEthToken, - totalSupply: value, + totalSupply, account: sender1, balance: value, deposit: value, @@ -119,7 +98,7 @@ contract('StakedEthToken', ([_, ...accounts]) => { await checkStakedEthToken({ stakedEthToken, - totalSupply: value, + totalSupply, account: sender1, balance: value, deposit: value, @@ -139,7 +118,7 @@ contract('StakedEthToken', ([_, ...accounts]) => { await checkStakedEthToken({ stakedEthToken, - totalSupply: value, + totalSupply, account: sender1, balance: value, deposit: value, @@ -159,7 +138,7 @@ contract('StakedEthToken', ([_, ...accounts]) => { await checkStakedEthToken({ stakedEthToken, - totalSupply: value, + totalSupply, account: sender1, balance: value, deposit: value, @@ -177,7 +156,7 @@ contract('StakedEthToken', ([_, ...accounts]) => { await checkStakedEthToken({ stakedEthToken, - totalSupply: value, + totalSupply, account: sender1, balance: value, deposit: value, @@ -197,7 +176,7 @@ contract('StakedEthToken', ([_, ...accounts]) => { await checkStakedEthToken({ stakedEthToken, - totalSupply: value, + totalSupply, account: sender1, balance: new BN(0), deposit: new BN(0), @@ -205,7 +184,7 @@ contract('StakedEthToken', ([_, ...accounts]) => { await checkStakedEthToken({ stakedEthToken, - totalSupply: value, + totalSupply, account: sender2, balance: value, deposit: value, diff --git a/test/utils.js b/test/utils.js index dff2f330..804f866f 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,15 +1,7 @@ +const hre = require('hardhat'); const { expectEvent, constants } = require('@openzeppelin/test-helpers'); const { expect } = require('chai'); const { BN, ether, balance } = require('@openzeppelin/test-helpers'); -const { - deployStakedEthToken, - deployRewardEthToken, - initializeStakedEthToken, - initializeRewardEthToken, -} = require('../deployments/tokens'); - -const StakedEthToken = artifacts.require('StakedEthToken'); -const RewardEthToken = artifacts.require('RewardEthToken'); function getDepositAmount({ min = new BN('1'), max = ether('1000') } = {}) { return ether(Math.random().toFixed(8)) @@ -38,14 +30,6 @@ async function checkCollectorBalance( ).to.be.bignumber.equal(correctBalance); } -async function checkPoolCollectedAmount( - poolContract, - correctAmount = new BN(0) -) { - let collectedAmount = await poolContract.collectedAmount(); - expect(collectedAmount).to.be.bignumber.equal(correctAmount); -} - async function checkSoloDepositAdded({ receipt, solos, @@ -127,7 +111,6 @@ async function checkRewardEthToken({ rewardEthToken, totalSupply, account, - reward, balance, }) { if (totalSupply != null) { @@ -136,12 +119,6 @@ async function checkRewardEthToken({ ); } - if (account != null && reward != null) { - expect(await rewardEthToken.balanceOf(account)).to.be.bignumber.equal( - reward - ); - } - if (account != null && balance != null) { expect(await rewardEthToken.balanceOf(account)).to.be.bignumber.equal( balance @@ -149,30 +126,90 @@ async function checkRewardEthToken({ } } -async function deployTokens({ - adminAddress, - oraclesContractAddress, - poolContractAddress, +async function getOracleAccounts({ oracles }) { + let oracleAccounts = []; + let oracleRole = await oracles.ORACLE_ROLE(); + for (let i = 0; i < (await oracles.getRoleMemberCount(oracleRole)); i++) { + let oracle = await oracles.getRoleMember(oracleRole, i); + await impersonateAccount(oracle); + oracleAccounts.push(oracle); + } + return oracleAccounts; +} + +async function setActivatedValidators({ + rewardEthToken, + oracles, + oracleAccounts, + pool, + activatedValidators, }) { - const stakedEthTokenContractAddress = await deployStakedEthToken(); - const rewardEthTokenContractAddress = await deployRewardEthToken(); - await initializeStakedEthToken( - stakedEthTokenContractAddress, - adminAddress, - rewardEthTokenContractAddress, - poolContractAddress - ); - await initializeRewardEthToken( - rewardEthTokenContractAddress, - adminAddress, - stakedEthTokenContractAddress, - oraclesContractAddress - ); + let prevActivatedValidators = await pool.activatedValidators(); + if (prevActivatedValidators.eq(activatedValidators)) { + return; + } + + let totalRewards = await rewardEthToken.totalRewards(); + let receipt; + for (let i = 0; i < oracleAccounts.length; i++) { + receipt = await oracles.vote(totalRewards, activatedValidators, { + from: oracleAccounts[i], + }); + if ((await pool.activatedValidators()).eq(activatedValidators)) { + return receipt; + } + } +} + +async function setTotalRewards({ + rewardEthToken, + oracles, + oracleAccounts, + pool, + totalRewards, +}) { + if ((await rewardEthToken.totalSupply()).eq(totalRewards)) { + return; + } + + let activatedValidators = await pool.activatedValidators(); + let receipt; + for (let i = 0; i < oracleAccounts.length; i++) { + receipt = await oracles.vote(totalRewards, activatedValidators, { + from: oracleAccounts[i], + }); + if ((await rewardEthToken.totalSupply()).eq(totalRewards)) { + return receipt; + } + } +} + +async function impersonateAccount(account) { + return hre.network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [account], + }); +} - return [ - await RewardEthToken.at(rewardEthTokenContractAddress), - await StakedEthToken.at(stakedEthTokenContractAddress), - ]; +async function stopImpersonatingAccount(account) { + return hre.network.provider.request({ + method: 'hardhat_stopImpersonatingAccount', + params: [account], + }); +} + +async function resetFork() { + await hre.network.provider.request({ + method: 'hardhat_reset', + params: [ + { + forking: { + jsonRpcUrl: hre.config.networks.hardhat.forking.url, + blockNumber: hre.config.networks.hardhat.forking.blockNumber, + }, + }, + ], + }); } module.exports = { @@ -181,8 +218,12 @@ module.exports = { checkSoloDepositAdded, checkValidatorRegistered, getDepositAmount, - checkPoolCollectedAmount, checkStakedEthToken, checkRewardEthToken, - deployTokens, + impersonateAccount, + stopImpersonatingAccount, + resetFork, + setActivatedValidators, + setTotalRewards, + getOracleAccounts, }; diff --git a/yarn.lock b/yarn.lock index e16bb183..a10ebc40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,24 +2,31 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0": +"@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" -"@babel/helper-validator-identifier@^7.10.4": +"@babel/code-frame@^7.0.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/helper-validator-identifier@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": + version "7.13.8" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.8.tgz#10b2dac78526424dfc1f47650d0e415dfd9dc481" + integrity sha512-4vrIhfJyfNf+lCtXC2ck1rKSzDwciqF7IWFhXXrSOUC2O5DrVp+w4c6ed4AllTxhTkUP5x2tYj41VaxdVMMRDw== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-validator-identifier" "^7.12.11" chalk "^2.0.0" js-tokens "^4.0.0" @@ -49,10 +56,15 @@ ts-node "^8.0.2" url-join "^4.0.0" -"@eslint/eslintrc@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" - integrity sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== +"@cto.af/textdecoder@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@cto.af/textdecoder/-/textdecoder-0.0.0.tgz#e1e8d84c936c30a0f4619971f19ca41941af9fdc" + integrity sha512-sJpx3F5xcVV/9jNYJQtvimo4Vfld/nD3ph+ZWtQzZ03Zo8rJC7QKQTRcIGS13Rcz80DwFNthCWMrd58vpY4ZAQ== + +"@eslint/eslintrc@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.0.tgz#99cc0a0584d72f1df38b900fb062ba995f395547" + integrity sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog== dependencies: ajv "^6.12.4" debug "^4.1.1" @@ -61,7 +73,6 @@ ignore "^4.0.6" import-fresh "^3.2.1" js-yaml "^3.13.1" - lodash "^4.17.20" minimatch "^3.0.4" strip-json-comments "^3.1.1" @@ -80,10 +91,10 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.0.10", "@ethersproject/abi@^5.0.10": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.10.tgz#c32baa919ad0e5cddabb2f3a8aed0eaeeed7fa4a" - integrity sha512-cfC3lGgotfxX3SMri4+CisOPwignoj/QGHW9J29spC4R4Qqcnk/SYuVkPFBMdLbvBp3f/pGiVqPNwont0TSXhg== +"@ethersproject/abi@5.0.12", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.10", "@ethersproject/abi@^5.0.2": + version "5.0.12" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.12.tgz#9aebe6aedc05ce45bb6c41b06d80bd195b7de77c" + integrity sha512-Ujr/3bwyYYjXLDQfebeiiTuvOw9XtUKM8av6YkoBeMXyGQM9GkjrQlwJMNwGTmqjATH/ZNbRgCh98GjOLiIB1Q== dependencies: "@ethersproject/address" "^5.0.9" "@ethersproject/bignumber" "^5.0.13" @@ -110,25 +121,10 @@ "@ethersproject/properties" "^5.0.3" "@ethersproject/strings" "^5.0.4" -"@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.2": +"@ethersproject/abstract-provider@5.0.9", "@ethersproject/abstract-provider@^5.0.8": version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.9.tgz#738c1c557e56d8f395a5a27caef9b0449bc85a10" - integrity sha512-ily2OufA2DTrxkiHQw5GqbkMSnNKuwZBqKsajtT0ERhZy1r9w2CpW1bmtRMIGzaqQxCdn/GEoFogexk72cBBZQ== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abstract-provider@5.0.8", "@ethersproject/abstract-provider@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.8.tgz#880793c29bfed33dff4c2b2be7ecb9ba966d52c0" - integrity sha512-fqJXkewcGdi8LogKMgRyzc/Ls2js07yor7+g9KfPs09uPOcQLg7cc34JN+lk34HH9gg2HU0DIA5797ZR8znkfw== + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.9.tgz#a55410b73e3994842884eb82b1f43e3a9f653eea" + integrity sha512-X9fMkqpeu9ayC3JyBkeeZhn35P4xQkpGX/l+FrxDtEW9tybf/UWXSMi8bGThpPtfJ6q6U2LDetXSpSwK4TfYQQ== dependencies: "@ethersproject/bignumber" "^5.0.13" "@ethersproject/bytes" "^5.0.9" @@ -138,23 +134,10 @@ "@ethersproject/transactions" "^5.0.9" "@ethersproject/web" "^5.0.12" -"@ethersproject/abstract-provider@^5.0.4": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.7.tgz#04ee3bfe43323384e7fecf6c774975b8dec4bdc9" - integrity sha512-NF16JGn6M0zZP5ZS8KtDL2Rh7yHxZbUjBIHLNHMm/0X0BephhjUWy8jqs/Zks6kDJRzNthgmPVy41Ec0RYWPYA== - dependencies: - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/networks" "^5.0.3" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/transactions" "^5.0.5" - "@ethersproject/web" "^5.0.6" - -"@ethersproject/abstract-signer@5.0.11", "@ethersproject/abstract-signer@^5.0.10": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.11.tgz#675da9ec168905c60ee79a6da95f7157ca956f46" - integrity sha512-RKOgPSEYafknA62SrD3OCK42AllHE4YBfKYXyQeM+sBP7Nq3X5FpzeoY4uzC43P4wIhmNoTHCKQuwnX7fBqb6Q== +"@ethersproject/abstract-signer@5.0.13", "@ethersproject/abstract-signer@^5.0.10": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.13.tgz#59b4d0367d6327ec53bc269c6730c44a4a3b043c" + integrity sha512-VBIZEI5OK0TURoCYyw0t3w+TEO4kdwnI9wvt4kqUwyxSn3YCRpXYVl0Xoe7XBR/e5+nYOi2MyFGJ3tsFwONecQ== dependencies: "@ethersproject/abstract-provider" "^5.0.8" "@ethersproject/bignumber" "^5.0.13" @@ -162,21 +145,10 @@ "@ethersproject/logger" "^5.0.8" "@ethersproject/properties" "^5.0.7" -"@ethersproject/abstract-signer@^5.0.6": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.9.tgz#238ddc06031aeb9dfceee2add965292d7dd1acbf" - integrity sha512-CM5UNmXQaA03MyYARFDDRjHWBxujO41tVle7glf5kHcQsDDULgqSVpkliLJMtPzZjOKFeCVZBHybTZDEZg5zzg== - dependencies: - "@ethersproject/abstract-provider" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - -"@ethersproject/address@5.0.9", "@ethersproject/address@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.9.tgz#347ef30dc8243c682574a3f23ff63f73c8f8cbf1" - integrity sha512-gKkmbZDMyGbVjr8nA5P0md1GgESqSGH7ILIrDidPdNXBl4adqbuA3OAuZx/O2oGpL6PtJ9BDa0kHheZ1ToHU3w== +"@ethersproject/address@5.0.10", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.0.9": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.10.tgz#2bc69fdff4408e0570471cd19dee577ab06a10d0" + integrity sha512-70vqESmW5Srua1kMDIN6uVfdneZMaMyRYH4qPvkAXGkbicrCOsA9m01vIloA4wYiiF+HLEfL1ENKdn5jb9xiAw== dependencies: "@ethersproject/bignumber" "^5.0.13" "@ethersproject/bytes" "^5.0.9" @@ -184,89 +156,48 @@ "@ethersproject/logger" "^5.0.8" "@ethersproject/rlp" "^5.0.7" -"@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.0.5": +"@ethersproject/base64@5.0.8", "@ethersproject/base64@^5.0.7": version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.8.tgz#0c551659144a5a7643c6bea337149d410825298f" - integrity sha512-V87DHiZMZR6hmFYmoGaHex0D53UEbZpW75uj8AqPbjYUmi65RB4N2LPRcJXuWuN2R0Y2CxkvW6ArijWychr5FA== - dependencies: - "@ethersproject/bignumber" "^5.0.10" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/rlp" "^5.0.3" - -"@ethersproject/base64@5.0.7", "@ethersproject/base64@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.7.tgz#d5da73699b4a33dc92bd8e5056ad1880b262057d" - integrity sha512-S5oh5DVfCo06xwJXT8fQC68mvJfgScTl2AXvbYMsHNfIBTDb084Wx4iA9MNlEReOv6HulkS+gyrUM/j3514rSw== + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.8.tgz#1bc4b4b8c59c1debf972c7164b96c0b8964a20a1" + integrity sha512-PNbpHOMgZpZ1skvQl119pV2YkCPXmZTxw+T92qX0z7zaMFPypXWTZBzim+hUceb//zx4DFjeGT4aSjZRTOYThg== dependencies: "@ethersproject/bytes" "^5.0.9" -"@ethersproject/base64@^5.0.3": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.6.tgz#26311ebf29ea3d0b9c300ccf3e1fdc44b7481516" - integrity sha512-HwrGn8YMiUf7bcdVvB4NJ+eWT0BtEFpDtrYxVXEbR7p/XBSJjwiR7DEggIiRvxbualMKg+EZijQWJ3az2li0uw== - dependencies: - "@ethersproject/bytes" "^5.0.4" - -"@ethersproject/basex@5.0.7", "@ethersproject/basex@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.7.tgz#2f7026b12c9dee6cdc7b7bf1805461836e635495" - integrity sha512-OsXnRsujGmYD9LYyJlX+cVe5KfwgLUbUJrJMWdzRWogrygXd5HvGd7ygX1AYjlu1z8W/+t2FoQnczDR/H2iBjA== +"@ethersproject/basex@5.0.8", "@ethersproject/basex@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.8.tgz#6867fad20047aa29fbd4b880f27894ed04cc7bb8" + integrity sha512-PCVKZIShBQUqAXjJSvaCidThPvL0jaaQZcewJc0sf8Xx05BizaOS8r3jdPdpNdY+/qZtRDqwHTSKjvR/xssyLQ== dependencies: "@ethersproject/bytes" "^5.0.9" "@ethersproject/properties" "^5.0.7" -"@ethersproject/bignumber@5.0.13", "@ethersproject/bignumber@^5.0.13": - version "5.0.13" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.13.tgz#a5466412b3b80104097b9c694f6ae827df4353fe" - integrity sha512-b89bX5li6aK492yuPP5mPgRVgIxxBP7ksaBtKX5QQBsrZTpNOjf/MR4CjcUrAw8g+RQuD6kap9lPjFgY4U1/5A== +"@ethersproject/bignumber@5.0.14", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.13", "@ethersproject/bignumber@^5.0.7": + version "5.0.14" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.14.tgz#605bc61dcbd4a8c6df8b5a7a77c0210273f3de8a" + integrity sha512-Q4TjMq9Gg3Xzj0aeJWqJgI3tdEiPiET7Y5OtNtjTAODZ2kp4y9jMNg97zVcvPedFvGROdpGDyCI77JDFodUzOw== dependencies: "@ethersproject/bytes" "^5.0.9" "@ethersproject/logger" "^5.0.8" bn.js "^4.4.0" -"@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.10", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.0.8": - version "5.0.12" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.12.tgz#fe4a78667d7cb01790f75131147e82d6ea7e7cba" - integrity sha512-mbFZjwthx6vFlHG9owXP/C5QkNvsA+xHpDCkPPPdG2n1dS9AmZAL5DI0InNLid60rQWL3MXpEl19tFmtL7Q9jw== - dependencies: - "@ethersproject/bytes" "^5.0.8" - "@ethersproject/logger" "^5.0.5" - bn.js "^4.4.0" - -"@ethersproject/bytes@5.0.9", "@ethersproject/bytes@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.9.tgz#2748247402ad20df69f3a3e935dc7b58c0d75c08" - integrity sha512-k+17ZViDtAugC0s7HM6rdsTWEdIYII4RPCDkPEuxKc6i40Bs+m6tjRAtCECX06wKZnrEoR9pjOJRXHJ/VLoOcA== +"@ethersproject/bytes@5.0.10", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.0.9": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.10.tgz#aa49afe7491ba24ff76fa33d98677351263f9ba4" + integrity sha512-vpu0v1LZ1j1s9kERQIMnVU69MyHEzUff7nqK9XuCU4vx+AM8n9lU2gj7jtJIvGSt9HzatK/6I6bWusI5nyuaTA== dependencies: "@ethersproject/logger" "^5.0.8" -"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.8.tgz#cf1246a6a386086e590063a4602b1ffb6cc43db1" - integrity sha512-O+sJNVGzzuy51g+EMK8BegomqNIg+C2RO6vOt0XP6ac4o4saiq69FnjlsrNslaiMFVO7qcEHBsWJ9hx1tj1lMw== - dependencies: - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/constants@5.0.8", "@ethersproject/constants@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.8.tgz#50f2e23f48c0d1d0de3759ea79b68ec3e06435a1" - integrity sha512-sCc73pFBsl59eDfoQR5OCEZCRv5b0iywadunti6MQIr5lt3XpwxK1Iuzd8XSFO02N9jUifvuZRrt0cY0+NBgTg== +"@ethersproject/constants@5.0.9", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.9.tgz#81ac44c3bf612de63eb1c490b314ea1b932cda9f" + integrity sha512-2uAKH89UcaJP/Sc+54u92BtJtZ4cPgcS1p0YbB1L3tlkavwNvth+kNCUplIB1Becqs7BOZr0B/3dMNjhJDy4Dg== dependencies: "@ethersproject/bignumber" "^5.0.13" -"@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.7.tgz#44ff979e5781b17c8c6901266896c3ee745f4e7e" - integrity sha512-cbQK1UpE4hamB52Eg6DLhJoXeQ1plSzekh5Ujir1xdREdwdsZPPXKczkrWqBBR0KyywJZHN/o/hj0w8j7scSGg== - dependencies: - "@ethersproject/bignumber" "^5.0.7" - -"@ethersproject/contracts@5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.9.tgz#6c67c0ebe20ee1af903f7f43568401023334a181" - integrity sha512-CCTxVeDh6sjdSEbjzONhtwPjECvaHE62oGkY8M7kP0CHmgLD2SEGel0HZib8e5oQKRKGly9AKcUFW4g3rQ0AQw== +"@ethersproject/contracts@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.11.tgz#e6cc57698a05be2329cb2ca3d7e87686f95e438a" + integrity sha512-FTUUd/6x00dYL2VufE2VowZ7h3mAyBfCQMGwI3tKDIWka+C0CunllFiKrlYCdiHFuVeMotR65dIcnzbLn72MCw== dependencies: "@ethersproject/abi" "^5.0.10" "@ethersproject/abstract-provider" "^5.0.8" @@ -278,10 +209,10 @@ "@ethersproject/logger" "^5.0.8" "@ethersproject/properties" "^5.0.7" -"@ethersproject/hash@5.0.10", "@ethersproject/hash@^5.0.10": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.10.tgz#41bf37428e8ddbc229ffd81c47af667174cb491a" - integrity sha512-Tf0bvs6YFhw28LuHnhlDWyr0xfcDxSXdwM4TcskeBbmXVSKLv3bJQEEEBFUcRX0fJuslR3gCVySEaSh7vuMx5w== +"@ethersproject/hash@5.0.11", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.10", "@ethersproject/hash@^5.0.4": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.11.tgz#da89517438bbbf8a39df56fff09f0a71669ae7a7" + integrity sha512-H3KJ9fk33XWJ2djAW03IL7fg3DsDMYjO1XijiUb1hJ85vYfhvxu0OmsU7d3tg2Uv1H1kFSo8ghr3WFQ8c+NL3g== dependencies: "@ethersproject/abstract-signer" "^5.0.10" "@ethersproject/address" "^5.0.9" @@ -292,24 +223,10 @@ "@ethersproject/properties" "^5.0.7" "@ethersproject/strings" "^5.0.8" -"@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.4": +"@ethersproject/hdnode@5.0.9", "@ethersproject/hdnode@^5.0.8": version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.9.tgz#81252a848185b584aa600db4a1a68cad9229a4d4" - integrity sha512-e8/i2ZDeGSgCxXT0vocL54+pMbw5oX5fNjb2E3bAIvdkh5kH29M7zz1jHu1QDZnptIuvCZepIbhUH8lxKE2/SQ== - dependencies: - "@ethersproject/abstract-signer" "^5.0.6" - "@ethersproject/address" "^5.0.5" - "@ethersproject/bignumber" "^5.0.8" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.4" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/hdnode@5.0.8", "@ethersproject/hdnode@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.8.tgz#2b52ede921cfbce8de49da774ec5a74025fc2bb1" - integrity sha512-Mscpjd7BBjxYSWghaNMwV0xrBBkOoCq6YEPRm9MgE24CiBlzzbfEB5DGq6hiZqhQaxPkdCUtKKqZi3nt9hx43g== + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.9.tgz#ce65b430d3d3f0cd3c8f9dfaaf376b55881d9dba" + integrity sha512-S5UMmIC6XfFtqhUK4uTjD8GPNzSbE+sZ/0VMqFnA3zAJ+cEFZuEyhZDYnl2ItGJzjT4jsy+uEy1SIl3baYK1PQ== dependencies: "@ethersproject/abstract-signer" "^5.0.10" "@ethersproject/basex" "^5.0.7" @@ -324,10 +241,10 @@ "@ethersproject/transactions" "^5.0.9" "@ethersproject/wordlists" "^5.0.8" -"@ethersproject/json-wallets@5.0.10", "@ethersproject/json-wallets@^5.0.10": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.10.tgz#cdc9c27cb486762a3313e25f6f2fef0eb890dbaf" - integrity sha512-Ux36u+d7Dm0M5AQ+mWuHdvfGPMN8K1aaLQgwzrsD4ELTWlwRuHuQbmn7/GqeOpbfaV6POLwdYcBk2TXjlGp/IQ== +"@ethersproject/json-wallets@5.0.11", "@ethersproject/json-wallets@^5.0.10": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.11.tgz#86fdc41b7762acb443d6a896f6c61231ab2aee5d" + integrity sha512-0GhWScWUlXXb4qJNp0wmkU95QS3YdN9UMOfMSEl76CRANWWrmyzxcBVSXSBu5iQ0/W8wO+xGlJJ3tpA6v3mbIw== dependencies: "@ethersproject/abstract-signer" "^5.0.10" "@ethersproject/address" "^5.0.9" @@ -343,67 +260,45 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.0.7", "@ethersproject/keccak256@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.7.tgz#2eedb5e4c160fcdf0079660f8ae362d7855ea943" - integrity sha512-zpUBmofWvx9PGfc7IICobgFQSgNmTOGTGLUxSYqZzY/T+b4y/2o5eqf/GGmD7qnTGzKQ42YlLNo+LeDP2qe55g== +"@ethersproject/keccak256@5.0.8", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.8.tgz#13aaf69e1c8bd15fc59a2ebd055c0878f2a059c8" + integrity sha512-zoGbwXcWWs9MX4NOAZ7N0hhgIRl4Q/IO/u9c/RHRY4WqDy3Ywm0OLamEV53QDwhjwn3YiiVwU1Ve5j7yJ0a/KQ== dependencies: "@ethersproject/bytes" "^5.0.9" js-sha3 "0.5.7" -"@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.3": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.6.tgz#5b5ba715ef1be86efde5c271f896fa0daf0e1efe" - integrity sha512-eJ4Id/i2rwrf5JXEA7a12bG1phuxjj47mPZgDUbttuNBodhSuZF2nEO5QdpaRjmlphQ8Kt9PNqY/z7lhtJptZg== - dependencies: - "@ethersproject/bytes" "^5.0.4" - js-sha3 "0.5.7" +"@ethersproject/logger@5.0.9", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.9.tgz#0e6a0b3ecc938713016954daf4ac7967467aa763" + integrity sha512-kV3Uamv3XOH99Xf3kpIG3ZkS7mBNYcLDM00JSDtNgNB4BihuyxpQzIZPRIDmRi+95Z/R1Bb0X2kUNHa/kJoVrw== -"@ethersproject/logger@5.0.8", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.0.8": +"@ethersproject/networks@5.0.8", "@ethersproject/networks@^5.0.7": version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.8.tgz#135c1903d35c878265f3cbf2b287042c4c20d5d4" - integrity sha512-SkJCTaVTnaZ3/ieLF5pVftxGEFX56pTH+f2Slrpv7cU0TNpUZNib84QQdukd++sWUp/S7j5t5NW+WegbXd4U/A== - -"@ethersproject/networks@5.0.7", "@ethersproject/networks@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.7.tgz#8d06e41197b27c2404d89a29ca21f741a01acbfc" - integrity sha512-dI14QATndIcUgcCBL1c5vUr/YsI5cCHLN81rF7PU+yS7Xgp2/Rzbr9+YqpC6NBXHFUASjh6GpKqsVMpufAL0BQ== + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.8.tgz#37e6f8c058f2d540373ea5939056cd3de069132e" + integrity sha512-PYpptlO2Tu5f/JEBI5hdlMds5k1DY1QwVbh3LKPb3un9dQA2bC51vd2/gRWAgSBpF3kkmZOj4FhD7ATLX4H+DA== dependencies: "@ethersproject/logger" "^5.0.8" -"@ethersproject/networks@^5.0.3": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.6.tgz#4d6586bbebfde1c027504ebf6dfb783b29c3803a" - integrity sha512-2Cg1N5109zzFOBfkyuPj+FfF7ioqAsRffmybJ2lrsiB5skphIAE72XNSCs4fqktlf+rwSh/5o/UXRjXxvSktZw== - dependencies: - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/pbkdf2@5.0.7", "@ethersproject/pbkdf2@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.7.tgz#a36fdb7327760ec0096857053e01c923a63417da" - integrity sha512-0SNLNixPMqnosH6pyc4yPiUu/C9/Jbu+f6I8GJW9U2qNpMBddmRJviwseoha5Zw1V+Aw0Z/yvYyzIIE8yPXqLA== +"@ethersproject/pbkdf2@5.0.8", "@ethersproject/pbkdf2@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.8.tgz#06a086b1ac04c75e6846afd6cf6170a49a634411" + integrity sha512-UlmAMGbIPaS2xXsI38FbePVTfJMuU9jnwcqVn3p88HxPF4kD897ha+l3TNsBqJqf32UbQL5GImnf1oJkSKq4vQ== dependencies: "@ethersproject/bytes" "^5.0.9" "@ethersproject/sha2" "^5.0.7" -"@ethersproject/properties@5.0.7", "@ethersproject/properties@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.7.tgz#951d11ba592ff90bbe8ec34c5a03a5157e3b3360" - integrity sha512-812H1Rus2vjw0zbasfDI1GLNPDsoyX1pYqiCgaR1BuyKxUTbwcH1B+214l6VGe1v+F6iEVb7WjIwMjKhb4EUsg== +"@ethersproject/properties@5.0.8", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.8.tgz#e45d28d25402c73394873dbf058f856c966cae01" + integrity sha512-zEnLMze2Eu2VDPj/05QwCwMKHh506gpT9PP9KPVd4dDB+5d6AcROUYVLoIIQgBYK7X/Gw0UJmG3oVtnxOQafAw== dependencies: "@ethersproject/logger" "^5.0.8" -"@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.0.4": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.6.tgz#44d82aaa294816fd63333e7def42426cf0e87b3b" - integrity sha512-a9DUMizYhJ0TbtuDkO9iYlb2CDlpSKqGPDr+amvlZhRspQ6jbl5Eq8jfu4SCcGlcfaTbguJmqGnyOGn1EFt6xA== - dependencies: - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/providers@5.0.19": - version "5.0.19" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.19.tgz#94c8f1a86755ee4187911fc6250e94b1116c089a" - integrity sha512-G+flo1jK1y/rvQy6b71+Nu7qOlkOKz+XqpgqFMZslkCzGuzQRmk9Qp7Ln4soK8RSyP1e5TCujaRf1H+EZahoaw== +"@ethersproject/providers@5.0.23": + version "5.0.23" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.23.tgz#1e26512303d60bbd557242532fdb5fa3c5d5fb73" + integrity sha512-eJ94z2tgPaUgUmxwd3BVkIzkgkbNIkY6wRPVas04LVaBTycObQbgj794aaUu2bfk7+Bn2B/gjUZtJW1ybxh9/A== dependencies: "@ethersproject/abstract-provider" "^5.0.8" "@ethersproject/abstract-signer" "^5.0.10" @@ -425,63 +320,45 @@ bech32 "1.1.4" ws "7.2.3" -"@ethersproject/random@5.0.7", "@ethersproject/random@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.7.tgz#e364268ce68bf6d300c36d654e622fd9d26b3a86" - integrity sha512-PxSRWwN3s+FH9AWMZU6AcWJsNQ9KzqKV6NgdeKPtxahdDjCuXxTAuzTZNXNRK+qj+Il351UnweAGd+VuZcOAlQ== +"@ethersproject/random@5.0.8", "@ethersproject/random@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.8.tgz#8d3726be48e95467abce9b23c93adbb1de009dda" + integrity sha512-4rHtotmd9NjklW0eDvByicEkL+qareIyFSbG1ShC8tPJJSAC0g55oQWzw+3nfdRCgBHRuEE7S8EcPcTVPvZ9cA== dependencies: "@ethersproject/bytes" "^5.0.9" "@ethersproject/logger" "^5.0.8" -"@ethersproject/rlp@5.0.7", "@ethersproject/rlp@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.7.tgz#cfa4fa6415960a435b7814e1a29bdfea657e2b6e" - integrity sha512-ulUTVEuV7PT4jJTPpfhRHK57tkLEDEY9XSYJtrSNHOqdwMvH0z7BM2AKIMq4LVDlnu4YZASdKrkFGEIO712V9w== +"@ethersproject/rlp@5.0.8", "@ethersproject/rlp@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.8.tgz#ff54e206d0ae28640dd054f2bcc7070f06f9dfbe" + integrity sha512-E4wdFs8xRNJfzNHmnkC8w5fPeT4Wd1U2cust3YeT16/46iSkLT8nn8ilidC6KhR7hfuSZE4UqSPzyk76p7cdZg== dependencies: "@ethersproject/bytes" "^5.0.9" "@ethersproject/logger" "^5.0.8" -"@ethersproject/rlp@^5.0.3": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.6.tgz#29f9097348a3c330811997433b7df89ab51cd644" - integrity sha512-M223MTaydfmQSsvqAl0FJZDYFlSqt6cgbhnssLDwqCKYegAHE16vrFyo+eiOapYlt32XAIJm0BXlqSunULzZuQ== - dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/sha2@5.0.7", "@ethersproject/sha2@^5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.7.tgz#ef9f18770c9f90a6cfd73840b0c3400910219099" - integrity sha512-MbUqz68hhp5RsaZdqi1eg1rrtiqt5wmhRYqdA7MX8swBkzW2KiLgK+Oh25UcWhUhdi1ImU9qrV6if5j0cC7Bxg== +"@ethersproject/sha2@5.0.8", "@ethersproject/sha2@^5.0.7": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.8.tgz#9903c67e562739d8b312820b0a265b9c9bf35fc3" + integrity sha512-ILP1ZgyvDj4rrdE+AXrTv9V88m7x87uga2VZ/FeULKPumOEw/4bGnJz/oQ8zDnDvVYRCJ+48VaQBS2CFLbk1ww== dependencies: "@ethersproject/bytes" "^5.0.9" "@ethersproject/logger" "^5.0.8" hash.js "1.1.3" -"@ethersproject/signing-key@5.0.8", "@ethersproject/signing-key@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.8.tgz#156522e542916b9aa9135527b40c5b6f9235af02" - integrity sha512-YKxQM45eDa6WAD+s3QZPdm1uW1MutzVuyoepdRRVmMJ8qkk7iOiIhUkZwqKLNxKzEJijt/82ycuOREc9WBNAKg== +"@ethersproject/signing-key@5.0.10", "@ethersproject/signing-key@^5.0.8": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.10.tgz#05e26e04f0aa5360dc78674d7331bacea8fea5c1" + integrity sha512-w5it3GbFOvN6e0mTd5gDNj+bwSe6L9jqqYjU+uaYS8/hAEp4qYLk5p8ZjbJJkNn7u1p0iwocp8X9oH/OdK8apA== dependencies: "@ethersproject/bytes" "^5.0.9" "@ethersproject/logger" "^5.0.8" "@ethersproject/properties" "^5.0.7" - elliptic "6.5.3" - -"@ethersproject/signing-key@^5.0.4": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.7.tgz#d03bfc5f565efb962bafebf8e6965e70d1c46d31" - integrity sha512-JYndnhFPKH0daPcIjyhi+GMcw3srIHkQ40hGRe6DA0CdGrpMfgyfSYDQ2D8HL2lgR+Xm4SHfEB0qba6+sCyrvg== - dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - elliptic "6.5.3" + elliptic "6.5.4" -"@ethersproject/solidity@5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.8.tgz#a260116a794bc97558d89e98f59831ce8d25c733" - integrity sha512-OJkyBq9KaoGsi8E8mYn6LX+vKyCURvxSp0yuGBcOqEFM3vkn9PsCiXsHdOXdNBvlHG5evJXwAYC2UR0TzgJeKA== +"@ethersproject/solidity@5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.9.tgz#49100fbe9f364ac56f7ff7c726f4f3d151901134" + integrity sha512-LIxSAYEQgLRXE3mRPCq39ou61kqP8fDrGqEeNcaNJS3aLbmAOS8MZp56uK++WsdI9hj8sNsFh78hrAa6zR9Jag== dependencies: "@ethersproject/bignumber" "^5.0.13" "@ethersproject/bytes" "^5.0.9" @@ -489,28 +366,19 @@ "@ethersproject/sha2" "^5.0.7" "@ethersproject/strings" "^5.0.8" -"@ethersproject/strings@5.0.8", "@ethersproject/strings@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.8.tgz#11a1b0ed1e8417408693789839f0b5f4e323c0c9" - integrity sha512-5IsdXf8tMY8QuHl8vTLnk9ehXDDm6x9FB9S9Og5IA1GYhLe5ZewydXSjlJlsqU2t9HRbfv97OJZV/pX8DVA/Hw== +"@ethersproject/strings@5.0.9", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.9.tgz#8e2eb2918b140231e1d1b883d77e43213a8ac280" + integrity sha512-ogxBpcUpdO524CYs841MoJHgHxEPUy0bJFDS4Ezg8My+WYVMfVAOlZSLss0Rurbeeam8CpUVDzM4zUn09SU66Q== dependencies: "@ethersproject/bytes" "^5.0.9" "@ethersproject/constants" "^5.0.8" "@ethersproject/logger" "^5.0.8" -"@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.7.tgz#8dc68f794c9e2901f3b75e53b2afbcb6b6c15037" - integrity sha512-a+6T80LvmXGMOOWQTZHtGGQEg1z4v8rm8oX70KNs55YtPXI/5J3LBbVf5pyqCKSlmiBw5IaepPvs5XGalRUSZQ== - dependencies: - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - -"@ethersproject/transactions@5.0.9", "@ethersproject/transactions@^5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.9.tgz#ccfcc1d395b5e3ce7342545fa28bfe5541182fd6" - integrity sha512-0Fu1yhdFBkrbMjenEr+39tmDxuHmaw0pe9Jb18XuKoItj7Z3p7+UzdHLr2S/okvHDHYPbZE5gtANDdQ3ZL1nBA== +"@ethersproject/transactions@5.0.10", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.9": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.10.tgz#d50cafd80d27206336f80114bc0f18bc18687331" + integrity sha512-Tqpp+vKYQyQdJQQk4M73tDzO7ODf2D42/sJOcKlDAAbdSni13v6a+31hUdo02qYXhVYwIs+ZjHnO4zKv5BNk8w== dependencies: "@ethersproject/address" "^5.0.9" "@ethersproject/bignumber" "^5.0.13" @@ -522,34 +390,19 @@ "@ethersproject/rlp" "^5.0.7" "@ethersproject/signing-key" "^5.0.8" -"@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.0.5": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.8.tgz#3b4d7041e13b957a9c4f131e0aea9dae7b6f5a23" - integrity sha512-i7NtOXVzUe+YSU6QufzlRrI2WzHaTmULAKHJv4duIZMLqzehCBXGA9lTpFgFdqGYcQJ7vOtNFC2BB2mSjmuXqg== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/rlp" "^5.0.3" - "@ethersproject/signing-key" "^5.0.4" - -"@ethersproject/units@5.0.9": - version "5.0.9" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.9.tgz#f8dc406f593eadcba883d6e86cc077203b03e7da" - integrity sha512-4jIkcMVrJ3lCgXMO4M/2ww0/T/IN08vJTZld7FIAwa6aoBDTAy71+sby3sShl1SG3HEeKYbI3fBWauCUgPRUpQ== +"@ethersproject/units@5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.10.tgz#9cca3b65cd0c92fab1bd33f2abd233546dd61987" + integrity sha512-eaiHi9ham5lbC7qpqxpae7OY/nHJUnRUnFFuEwi2VB5Nwe3Np468OAV+e+HR+jAK4fHXQE6PFBTxWGtnZuO37g== dependencies: "@ethersproject/bignumber" "^5.0.13" "@ethersproject/constants" "^5.0.8" "@ethersproject/logger" "^5.0.8" -"@ethersproject/wallet@5.0.10": - version "5.0.10" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.10.tgz#16ad0864d9e0e2b57fb32d768ea4161891d62727" - integrity sha512-5siYr38NhqZKH6DUr6u4PdhgOKur8Q6sw+JID2TitEUmW0tOl8f6rpxAe77tw6SJT60D2UcvgsyLtl32+Nl+ig== +"@ethersproject/wallet@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.11.tgz#9891936089d1b91e22ed59f850bc344b1544bf26" + integrity sha512-2Fg/DOvUltR7aZTOyWWlQhru+SKvq2UE3uEhXSyCFgMqDQNuc2nHXh1SHJtN65jsEbjVIppOe1Q7EQMvhmeeRw== dependencies: "@ethersproject/abstract-provider" "^5.0.8" "@ethersproject/abstract-signer" "^5.0.10" @@ -567,10 +420,10 @@ "@ethersproject/transactions" "^5.0.9" "@ethersproject/wordlists" "^5.0.8" -"@ethersproject/web@5.0.12", "@ethersproject/web@^5.0.12": - version "5.0.12" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.12.tgz#f123397c107f863c31fce5f31a97c66ec155e755" - integrity sha512-gVxS5iW0bgidZ76kr7LsTxj4uzN5XpCLzvZrLp8TP+4YgxHfCeetFyQkRPgBEAJdNrexdSBayvyJvzGvOq0O8g== +"@ethersproject/web@5.0.13", "@ethersproject/web@^5.0.12": + version "5.0.13" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.13.tgz#5a92ac6d835d2ebce95b6b645a86668736e2f532" + integrity sha512-G3x/Ns7pQm21ALnWLbdBI5XkW/jrsbXXffI9hKNPHqf59mTxHYtlNiSwxdoTSwCef3Hn7uvGZpaSgTyxs7IufQ== dependencies: "@ethersproject/base64" "^5.0.7" "@ethersproject/bytes" "^5.0.9" @@ -578,21 +431,10 @@ "@ethersproject/properties" "^5.0.7" "@ethersproject/strings" "^5.0.8" -"@ethersproject/web@^5.0.6": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.11.tgz#d47da612b958b4439e415782a53c8f8461522d68" - integrity sha512-x03ihbPoN1S8Gsh9WSwxkYxUIumLi02ZEKJku1C43sxBfe+mdprWyvujzYlpuoRNfWRgNhdRDKMP8JbG6MwNGA== - dependencies: - "@ethersproject/base64" "^5.0.3" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/wordlists@5.0.8", "@ethersproject/wordlists@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.8.tgz#593319b710a5a1f4e839b72641aa765b4f111137" - integrity sha512-px2mloc1wAcdTbzv0ZotTx+Uh/dfnDO22D9Rx8xr7+/PUwAhZQjoJ9t7Hn72nsaN83rWBXsLvFcIRZju4GIaEQ== +"@ethersproject/wordlists@5.0.9", "@ethersproject/wordlists@^5.0.8": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.9.tgz#f16cc0b317637c3ae9c689ebd7bc2cbbffadd013" + integrity sha512-Sn6MTjZkfbriod6GG6+p43W09HOXT4gwcDVNj0YoPYlo4Zq2Fk6b1CU9KUX3c6aI17PrgYb4qwZm5BMuORyqyQ== dependencies: "@ethersproject/bytes" "^5.0.9" "@ethersproject/hash" "^5.0.10" @@ -600,31 +442,31 @@ "@ethersproject/properties" "^5.0.7" "@ethersproject/strings" "^5.0.8" -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== +"@nodelib/fs.scandir@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" + integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== dependencies: - "@nodelib/fs.stat" "2.0.3" + "@nodelib/fs.stat" "2.0.4" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== +"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" + integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" + integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.4" fastq "^1.6.0" -"@nomiclabs/ethereumjs-vm@^4.1.1": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#a853bdb4fb032529f810f32bb767551d19d7ce57" - integrity sha512-+XwqoO941bILTO4KDLIUJ37U42ySxw6it7jyoi0tKv0/VUcOrWKF1TCQWMv6dBDRlxpPQd273n9o5SVlYYLRWQ== +"@nomiclabs/ethereumjs-vm@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.2.tgz#2f8817113ca0fb6c44c1b870d0a809f0e026a6cc" + integrity sha512-8WmX94mMcJaZ7/m7yBbyuS6B+wuOul+eF+RY9fBpGhNaUpyMR/vFIcDojqcWQ4Yafe1tMKY5LDu2yfT4NZgV4Q== dependencies: async "^2.1.2" async-eventemitter "^0.2.2" @@ -637,7 +479,7 @@ ethereumjs-util "^6.2.0" fake-merkle-patricia-tree "^1.0.1" functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" + merkle-patricia-tree "3.0.0" rustbn.js "~0.2.0" safe-buffer "^5.1.1" util.promisify "^1.0.0" @@ -647,14 +489,15 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.1.tgz#f86a6fa210dbe6270adffccc75e93ed60a856904" integrity sha512-uTFHDhhvJ+UjfvvMeQxD3ZALuzuI3FXzTYT1Z5N3ebyZL5z4Ogwt55GB0R9tdKY0p5HhDhBjU/gsCjUEwIVoaw== -"@nomiclabs/hardhat-etherscan@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.0.tgz#08512c3e602155dc0d2becb193cd2e0155867839" - integrity sha512-YK9/UZI1Ct9TYfqZJnjIERlFC7bFrG0eUS2O0kFrH8RjLdcQXBI0GNpxXGAuDbotBg0t8wRKHibbK50TQu0ybA== +"@nomiclabs/hardhat-etherscan@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.1.tgz#186f3fa652a0ca20fb77aa857cfad2da845d5cbf" + integrity sha512-8TNUFsO5DpAfwNlXMDhcEtFAMOYsVNaQL2vq5vuCD45kUKBgL8H21++zOk231ha9D7LQWBMCIg7A7iPxw6Jwmg== dependencies: "@ethersproject/abi" "^5.0.2" "@ethersproject/address" "^5.0.2" cbor "^5.0.2" + debug "^4.1.1" fs-extra "^7.0.1" node-fetch "^2.6.0" semver "^6.3.0" @@ -701,21 +544,21 @@ fs-extra "^8.1.0" "@openzeppelin/contracts-upgradeable@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-3.3.0.tgz#a536c6ff107d21319490e6cb699e555a3edcf6ea" - integrity sha512-kJeNuKauR4xH52Yo3GdXXAOW4CWyWdm7VXcJFe63G8TRb45ISSnkt/gXwUa8zzEYqokQrwNZYoH/iGYfUlp6wA== + version "3.4.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-3.4.0.tgz#7674c73c643a509f1b90c509e3e72fe9aae02aeb" + integrity sha512-7wBcbukDqWZt/B1zjb7zyeWq+AC7rx7nGln7/hPxHdKd8PAiiteXd51Cp2KmGP8qaY0/TXh/fQLsA082LWp8Zw== "@openzeppelin/contracts@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.3.0.tgz#ffdb693c5c349fc33bba420248dd3ac0a2d7c408" - integrity sha512-AemZEsQYtUp1WRkcmZm1div5ORfTpLquLaziCIrSagjxyKdmObxuaY1yjQ5SHFMctR8rLwp706NXTbiIRJg7pw== + version "3.4.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.0.tgz#9a1669ad5f9fdfb6e273bb5a4fed10cb4cc35eb0" + integrity sha512-qh+EiHWzfY/9CORr+eRUkeEUP1WiFUcq3974bLHwyYzLBUtK6HPaMkIUHi74S1rDTZ0sNz42DwPc5A4IJvN3rg== -"@openzeppelin/hardhat-upgrades@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.5.0.tgz#580143b8f0c68ca123a45874f2aa83f51e71b6ff" - integrity sha512-UVA37KEmCtDI8k7TEPwAQQvmRO32I9h4ErS7YmPZNKvzWEU+yY69f61YZjdNUvUh6BY4I7numVYh9EU4Bttg7Q== +"@openzeppelin/hardhat-upgrades@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.6.0.tgz#735e1c70aea859e284937995e238fcfdea7b69d7" + integrity sha512-4oRB5lH3d5RAUIWKX5wuJvgo06IOgndUoPKYUuLTKW2BmyrMTPc6GZycKf7UCxU0GYeUC9BjsohUAIjqJwMnww== dependencies: - "@openzeppelin/upgrades-core" "^1.4.2" + "@openzeppelin/upgrades-core" "^1.5.0" "@openzeppelin/test-helpers@^0.5.10": version "0.5.10" @@ -733,13 +576,13 @@ web3 "^1.2.5" web3-utils "^1.2.5" -"@openzeppelin/upgrades-core@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.4.2.tgz#e96dbb36f839ff4d39b314ab79b18a08dbf94c90" - integrity sha512-GbhPu8HXNdfHQNSIDkDvncWzZmwuv+RrOnDcePo2B++uMxFiEbKNyKCwUVvqZZd8StlxyxCs95E1ci/TZ6Dzfg== +"@openzeppelin/upgrades-core@^1.5.0": + version "1.5.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/upgrades-core/-/upgrades-core-1.5.1.tgz#2165f0c2961cc748e7d1c2bce1ba96589d31390b" + integrity sha512-rL0h/+Yfcky98XaxLRcxKunmC2uVP+dr9tVxzZfbjDpIco7VkmyODsI1YBPZTn3e5kCj7A6cmgNrFmao/UkQyA== dependencies: bn.js "^5.1.2" - cbor "^5.0.2" + cbor "^7.0.0" chalk "^4.1.0" compare-versions "^3.6.0" debug "^4.1.1" @@ -747,74 +590,74 @@ fp-ts "^2.7.1" io-ts "^2.2.9" proper-lockfile "^4.1.1" - solidity-ast "^0.4.4" + solidity-ast "^0.4.15" -"@sentry/core@5.29.1": - version "5.29.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.29.1.tgz#c56cfb6747005413d194f4cfe9a5bbdf5d5e377f" - integrity sha512-SMybIx9IlswkJ7a61ez/zjdiMdAo51Adpo4nVrzke2k84U/t726/EbJj0FJ4vVgsGdLCvSSZ6v7BQlINcwWupg== +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: - "@sentry/hub" "5.29.1" - "@sentry/minimal" "5.29.1" - "@sentry/types" "5.29.1" - "@sentry/utils" "5.29.1" + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/hub@5.29.1": - version "5.29.1" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.29.1.tgz#64c738af308c909fe8fcf7c5da9e0685343385bb" - integrity sha512-Ig/vqCiJcsnGaWajkWRFH+5IKeo50ZtsjM0zJb8IfTadLjQuF/gTQst0aXO3l6q4HzveeGsELY8jlm6WVcq9Aw== +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: - "@sentry/types" "5.29.1" - "@sentry/utils" "5.29.1" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/minimal@5.29.1": - version "5.29.1" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.29.1.tgz#0f1eab0eccc9d38cb0ff3b17b81dbf9c909cd383" - integrity sha512-lAa3+Duxum1qQvR0tKiBUsH6Ehit3g/vO53SqBib7YK3qdvIUWHacmkJvfz/AeSvVnpJ9bsBMCVRJNSVe8BPVA== +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: - "@sentry/hub" "5.29.1" - "@sentry/types" "5.29.1" + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" tslib "^1.9.3" "@sentry/node@^5.18.1": - version "5.29.1" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.29.1.tgz#3805176a398dcbb1234ea60c809e3cb14663fe40" - integrity sha512-j8PzW+Fk84UZJkxPSnyEE4HTQxphSAAauGbeLiEJ69ZZGKD7/O1CBxEsvPel3n4jGe/9bK+AIuEpLHwoZjex0Q== - dependencies: - "@sentry/core" "5.29.1" - "@sentry/hub" "5.29.1" - "@sentry/tracing" "5.29.1" - "@sentry/types" "5.29.1" - "@sentry/utils" "5.29.1" + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" cookie "^0.4.1" https-proxy-agent "^5.0.0" lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/tracing@5.29.1": - version "5.29.1" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.29.1.tgz#ce97fa749bd80534bf084479fd60ba64043a19f0" - integrity sha512-iWfPtDhf5X7N9R5WB3vX/wlyFVsGG8iMx4hLIP+6bj8EcPYnZfeP6Sxn65a0ACT/FKv7SMBoZ1qPDzmvk0bviw== +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: - "@sentry/hub" "5.29.1" - "@sentry/minimal" "5.29.1" - "@sentry/types" "5.29.1" - "@sentry/utils" "5.29.1" + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/types@5.29.1": - version "5.29.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.29.1.tgz#ecc65909ac72d4f8024e26a64129e09d14a0a67f" - integrity sha512-QXZBA1gJheMYTGFV+UUhr3+jKpGZqPx8kEJABs8htlKabCDJlEeoFNmeqPuVxCxukoy5ZaaHACoE+2Z87T0g2A== +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== -"@sentry/utils@5.29.1": - version "5.29.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.29.1.tgz#889498950f6bde8ce054186096a3c95c0afb0fe4" - integrity sha512-FOhWxASvIQREAlSuWf3Vmb4uIkG0fmRdHkULpuv5dFmrMX2PpudYAppQtS8K9V4BYxFy6KFdUht1Qz5zYTecMw== +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: - "@sentry/types" "5.29.1" + "@sentry/types" "5.30.0" tslib "^1.9.3" "@sindresorhus/is@^0.14.0": @@ -822,12 +665,12 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@solidity-parser/parser@^0.11.0": +"@solidity-parser/parser@^0.11.0", "@solidity-parser/parser@^0.11.1": version "0.11.1" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add" integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ== -"@solidity-parser/parser@^0.8.1", "@solidity-parser/parser@^0.8.2": +"@solidity-parser/parser@^0.8.2": version "0.8.2" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.8.2.tgz#a6a5e93ac8dca6884a99a532f133beba59b87b69" integrity sha512-8LySx3qrNXPgB5JiULfG10O3V7QTxI/TLzSw5hFQhXWSkVxZBAv4rZQ0sYgLEbc8g3L2lmnujj1hKul38Eu5NQ== @@ -846,32 +689,39 @@ dependencies: source-map-support "^0.5.19" -"@truffle/codec@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.7.1.tgz#2ef0fa40109040796afbebb8812c872122100ae4" - integrity sha512-mNd6KnW6J0UB1zafGBXDlTEbCMvWpmPAJmzv7aF/nAIaN/F8UePSCiQ1OTQP39Rprj6GFiCCaWVnBAwum6UGSg== +"@truffle/blockchain-utils@^0.0.26": + version "0.0.26" + resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.0.26.tgz#f4ea794e0a18c74d73ea10e29a506c9ed0a503ee" + integrity sha512-M91NJkfapK1RqdzVwKSSenPEE2cHzAAFwC3aPhA8Y3DznRfzOcck4mDH6eY71sytVCrGaXGm/Wirn3drGSH+qQ== + dependencies: + source-map-support "^0.5.19" + +"@truffle/codec@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.10.0.tgz#306425897f92b71cf2c9f665a45351e445b4c09b" + integrity sha512-jRqUPQkiiZmXtms34nI2WmEAA4pQnKUhdtJGCeqKUKu2igZ35ZMKoXkpg1stvahawn17XZxo+8DjbFlR0uHq7w== dependencies: big.js "^5.2.2" - bn.js "^4.11.8" - borc "^2.1.2" - debug "^4.1.0" + bn.js "^5.1.3" + cbor "^5.1.0" + debug "^4.3.1" lodash.clonedeep "^4.5.0" lodash.escaperegexp "^4.1.2" lodash.partition "^4.6.0" lodash.sum "^4.0.2" - semver "^6.3.0" + semver "^7.3.4" source-map-support "^0.5.19" utf8 "^3.0.0" web3-utils "1.2.9" -"@truffle/codec@^0.9.4": - version "0.9.4" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.9.4.tgz#738187e6afc74a0a67dc201762b6ccb8121712d5" - integrity sha512-EAx/6Dg8Dj/O6/zqXpp4Q9OtxKmPKItmHWD91FM7bOXvX71wx66XZqIxD7ORjLEzQqYfJj81ttSnOZgpGxj3RA== +"@truffle/codec@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.7.1.tgz#2ef0fa40109040796afbebb8812c872122100ae4" + integrity sha512-mNd6KnW6J0UB1zafGBXDlTEbCMvWpmPAJmzv7aF/nAIaN/F8UePSCiQ1OTQP39Rprj6GFiCCaWVnBAwum6UGSg== dependencies: big.js "^5.2.2" bn.js "^4.11.8" - cbor "^5.1.0" + borc "^2.1.2" debug "^4.1.0" lodash.clonedeep "^4.5.0" lodash.escaperegexp "^4.1.2" @@ -882,37 +732,28 @@ utf8 "^3.0.0" web3-utils "1.2.9" -"@truffle/contract-schema@^3.2.5": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.3.2.tgz#6450738c35859ed087760d826031a8247f7bc907" - integrity sha512-PFNUHlcMFh6CDLDXTYCpm1G5rM5EJlneA9ml5y1TbkLgjLMICI2XLilimFZ/DC0THQekHpoQC+W/QMD/OTiTiw== - dependencies: - ajv "^6.10.0" - crypto-js "^3.1.9-1" - debug "^4.1.0" - -"@truffle/contract-schema@^3.3.3": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.3.3.tgz#3e9567596d5dd9843df195cc3a874b83246c2505" - integrity sha512-4bvcEoGycopJBPoCiqHP5Q72/1t/ixYS/pVHru+Rzvad641BgvoGrkd4YnyJ+E/MVb4ZLrndL7whmdGqV5B7SA== +"@truffle/contract-schema@^3.2.5", "@truffle/contract-schema@^3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.3.4.tgz#95f0265cac7de7bcaa0542f5fe671a7896011bfe" + integrity sha512-HzscBl/GhZBvPNQeD9l6ewSHSkvNmE+bA0iTVa0Y2mNf5GD5Y3fK2NPyfbOdtckOvLqebvYGEDEPRiXc3BZ05g== dependencies: ajv "^6.10.0" crypto-js "^3.1.9-1" - debug "^4.1.0" + debug "^4.3.1" "@truffle/contract@^4.0.35": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.3.5.tgz#360434b09bbf9a8d34ed2f7075f40d36509b180c" - integrity sha512-08gLSId+spnXqdM/25pOiurNcSBeCBa6KrplCgojy1RvqlG8JbEa9jXHWt1DCACZTtSnCsC2ywSNxAKRb4HqIA== - dependencies: - "@truffle/blockchain-utils" "^0.0.25" - "@truffle/contract-schema" "^3.3.3" - "@truffle/debug-utils" "^5.0.8" - "@truffle/error" "^0.0.11" - "@truffle/interface-adapter" "^0.4.18" + version "4.3.8" + resolved "https://registry.yarnpkg.com/@truffle/contract/-/contract-4.3.8.tgz#806c63d683be81e5fd09d54346b52d7bb3940b5b" + integrity sha512-pQjRVUQ9muV1zT/bzhCvyhQXLHQVZobhe/Dwt/sIoj5Alea0ueNPQTeLN6DmMWusNDSlY8fNM7mgXJ+izvdpxw== + dependencies: + "@truffle/blockchain-utils" "^0.0.26" + "@truffle/contract-schema" "^3.3.4" + "@truffle/debug-utils" "^5.0.10" + "@truffle/error" "^0.0.12" + "@truffle/interface-adapter" "^0.4.19" bignumber.js "^7.2.1" ethereum-ens "^0.8.0" - ethers "^4.0.0-beta.1" + ethers "^4.0.32" source-map-support "^0.5.19" web3 "1.2.9" web3-core-helpers "1.2.9" @@ -932,41 +773,46 @@ highlight.js "^9.15.8" highlightjs-solidity "^1.0.18" -"@truffle/debug-utils@^5.0.8": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-5.0.8.tgz#681c2bb595750c768f9a17f5c47facef19181044" - integrity sha512-2YzZzhhbZnUr+zQSiqkjF9cwwUPBFyMuH2/iGvjR+9l3+gpOm9+psN658dCziLV0qwiME4Tor4pIW7FnOEDegQ== +"@truffle/debug-utils@^5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-5.0.10.tgz#8dad322d404870e313b3b92cdaa609ad6212e08e" + integrity sha512-N2jqeHDmVh0xIe/BL2Or0/AAGAHxd2dM55NOAJYFPdekbigQEpmobTZtfUfpZU1oTQe+1yHpXXonkkjf+AKY7w== dependencies: - "@truffle/codec" "^0.9.4" + "@truffle/codec" "^0.10.0" "@trufflesuite/chromafi" "^2.2.2" bn.js "^5.1.3" chalk "^2.4.2" - debug "^4.1.0" + debug "^4.3.1" highlight.js "^10.4.0" - highlightjs-solidity "^1.0.20" + highlightjs-solidity "^1.0.21" "@truffle/error@^0.0.11": version "0.0.11" resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.11.tgz#2789c0042d7e796dcbb840c7a9b5d2bcd8e0e2d8" integrity sha512-ju6TucjlJkfYMmdraYY/IBJaFb+Sa+huhYtOoyOJ+G29KcgytUVnDzKGwC7Kgk6IsxQMm62Mc1E0GZzFbGGipw== -"@truffle/interface-adapter@^0.4.16", "@truffle/interface-adapter@^0.4.18": - version "0.4.18" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.18.tgz#1aac45596997d208085d5168f82b990624610646" - integrity sha512-P9JVSYD/CX3V+NgTWu+Bf71sLh8pMwrCpbiYRB93pRw/1H3ZTvt5iDC2MVvVxCs8FkSiy4OZzQK/DJ8+hXAmYw== +"@truffle/error@^0.0.12": + version "0.0.12" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.12.tgz#83e02e6ffe1d154fe274141d90038a91fd1e186d" + integrity sha512-kZqqnPR9YDJG7KCDOcN1qH16Qs0oz1PzF0Y93AWdhXuL9S9HYo/RUUeqGKbPpRBEZldQUS8aa4EzfK08u5pu6g== + +"@truffle/interface-adapter@^0.4.16", "@truffle/interface-adapter@^0.4.19": + version "0.4.19" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.4.19.tgz#19248ac88099f8df34f58a3d43a95ba3470dc89a" + integrity sha512-+Zz6Fr8+I2wYSS8RM3WBOMzf22QffMQTnlsYsRgRHzv3gYoRA9ZDLb84lFRfmWyw+IdXTo90tjRHEb5krC6uxg== dependencies: - bn.js "^4.11.8" + bn.js "^5.1.3" ethers "^4.0.32" source-map-support "^0.5.19" web3 "1.2.9" "@truffle/provider@^0.2.24": - version "0.2.25" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.25.tgz#32a9539b625fad2d2203be9843e8a9d3011aebed" - integrity sha512-BohKgT2357c2dYCH2IQwldQ4EJkfsWUClpb3j+kR8ng02vbsyAPe0HMH463I+h+tiDKvL757dBltXpe0DBJusg== + version "0.2.26" + resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.26.tgz#88e31b79973c2427c4a17d9a59411e6fbc810190" + integrity sha512-YKPmhB9S9AQkT2ePGtadwjDduxU23DXXy+5zyM5fevw5GCbXSnf+jG6rICXjPkVFjuKBlXuq5JbuERZn43522Q== dependencies: - "@truffle/error" "^0.0.11" - "@truffle/interface-adapter" "^0.4.18" + "@truffle/error" "^0.0.12" + "@truffle/interface-adapter" "^0.4.19" web3 "1.2.9" "@trufflesuite/chromafi@^2.2.1", "@trufflesuite/chromafi@^2.2.2": @@ -1004,9 +850,9 @@ "@types/node" "*" "@types/chai@^4.2.0": - version "4.2.14" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.14.tgz#44d2dd0b5de6185089375d976b4ec5caf6861193" - integrity sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ== + version "4.2.15" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.15.tgz#b7a6d263c2cecf44b6de9a051cf496249b154553" + integrity sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ== "@types/concat-stream@^1.6.0": version "1.6.0" @@ -1041,19 +887,19 @@ integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== "@types/node@*": - version "14.14.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz#f7fd5f3cc8521301119f63910f0fb965c7d761ae" - integrity sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ== + version "14.14.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055" + integrity sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g== "@types/node@^10.0.3", "@types/node@^10.12.18": - version "10.17.49" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.49.tgz#ecf0b67bab4b84d0ec9b0709db4aac3824a51c4a" - integrity sha512-PGaJNs5IZz5XgzwJvL/1zRfZB7iaJ5BydZ8/Picm+lUNYoNO9iVTQkVy5eUh0dZDrx3rBOIs3GCbCRmMuYyqwg== + version "10.17.54" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.54.tgz#a737488631aca3ec7bd9f6229d77f1079e444793" + integrity sha512-c8Lm7+hXdSPmWH4B9z/P/xIXhFK3mCQin4yCYMd2p1qpMG5AfgyJuYZ+3q2dT7qLiMMMGMd5dnkFpdqJARlvtQ== "@types/node@^12.12.6", "@types/node@^12.6.1": - version "12.19.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.9.tgz#990ad687ad8b26ef6dcc34a4f69c33d40c95b679" - integrity sha512-yj0DOaQeUrk3nJ0bd3Y5PeDRJ6W0r+kilosLA+dzF3dola/o9hxhMSg2sFvVcA2UHS5JSOsZp4S0c1OEXc4m1Q== + version "12.20.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.4.tgz#73687043dd00fcb6962c60fbf499553a24d6bdf2" + integrity sha512-xRCgeE0Q4pT5UZ189TJ3SpYuX/QGl6QIAOAIeDSbAVAd2gX1NxSZup4jNVK7cxIeP8KDSbJgcckun495isP1jQ== "@types/node@^8.0.0": version "8.10.66" @@ -1084,11 +930,6 @@ dependencies: "@types/node" "*" -"@uniswap/v2-core@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@uniswap/v2-core/-/v2-core-1.0.1.tgz#af8f508bf183204779938969e2e54043e147d425" - integrity sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q== - abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1191,9 +1032,9 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: uri-js "^4.2.2" ajv@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" - integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + version "7.1.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.1.1.tgz#1e6b37a454021fa9941713f38b952fc1c8d32a84" + integrity sha512-ga/aqDYnUy/o7vbsRTFhhTsNeXiYb5JWDIcRIeZfwRNCefwjNTVYCGdGSUrEmiu3yDK3vFvNbgJxvrQW4JXrYQ== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1460,9 +1301,9 @@ bignumber.js@^7.2.1: integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== bindings@^1.5.0: version "1.5.0" @@ -1498,15 +1339,15 @@ bn.js@4.11.8: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" - integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== body-parser@1.19.0, body-parser@^1.16.0: version "1.19.0" @@ -1524,7 +1365,7 @@ body-parser@1.19.0, body-parser@^1.16.0: raw-body "2.4.0" type-is "~1.6.17" -boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= @@ -1557,7 +1398,7 @@ braces@^3.0.1, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brorand@^1.0.1: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= @@ -1659,7 +1500,7 @@ buffer-xor@^2.0.1: dependencies: safe-buffer "^5.1.1" -buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -1668,9 +1509,9 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: ieee754 "^1.1.13" bufferutil@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.2.tgz#79f68631910f6b993d870fc77dc0a2894eb96cd5" - integrity sha512-AtnG3W6M8B2n4xDQ5R+70EXvOpnXsFYg/AK2yTZd+HQ/oxAdz+GI+DvjmhBw3L0ole+LJ0ngqY4JMbDzkfNzhA== + version "4.0.3" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.3.tgz#66724b756bed23cd7c28c4d306d7994f9943cc6b" + integrity sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw== dependencies: node-gyp-build "^4.2.0" @@ -1692,13 +1533,13 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -call-bind@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" - integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" - get-intrinsic "^1.0.0" + get-intrinsic "^1.0.2" caller-callsite@^2.0.0: version "2.0.0" @@ -1747,15 +1588,7 @@ caseless@^0.12.0, caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -cbor@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.1.0.tgz#c3be220dcbbd96a338d279a664237aed3f596904" - integrity sha512-qzEc7kUShdMbWTaUH7X+aHW8owvBU3FS0dfYR1lGYpoZr0mGJhhojLlZJH653x/DfeMZ56h315FRNBUIG1R7qg== - dependencies: - bignumber.js "^9.0.0" - nofilter "^1.0.4" - -cbor@^5.1.0: +cbor@^5.0.2, cbor@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== @@ -1763,15 +1596,23 @@ cbor@^5.1.0: bignumber.js "^9.0.1" nofilter "^1.0.4" +cbor@^7.0.0: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-7.0.3.tgz#216d292f2aedd1bb61414a8f949b63e4de11b33b" + integrity sha512-Io+lJytjYBJKgJqZQUz2bFaMPj+HtlsnT9kHSUiIJFqzWa05lm5/ycQ+NiZWpks3DR2Fz7j7axiTGeT57w/syg== + dependencies: + "@cto.af/textdecoder" "^0.0.0" + nofilter "^2.0.3" + chai-bn@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/chai-bn/-/chai-bn-0.2.1.tgz#1dad95e24c3afcd8139ab0262e9bbefff8a30ab7" integrity sha512-01jt2gSXAw7UYFPT5K8d7HYjdXj2vyeIuE+0T/34FWzlNcVbs1JkPxRu7rYMfQnJhrHT8Nr6qjSf5ZwwLU2EYg== -chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== +chai@^4.2.0, chai@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.0.tgz#5523a5faf7f819c8a92480d70a8cccbadacfc25f" + integrity sha512-/BFd2J30EcOwmdOgXvVsmM48l0Br0nmZPlO0uOW4XKh6kpsUumRXBgPV+IlaqFaqr9cYbeoZAM1Npx0i4A+aiA== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" @@ -1819,17 +1660,29 @@ checkpoint-store@^1.1.0: dependencies: functional-red-black-tree "^1.0.1" -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.3" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6" - integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA== +cheerio-select-tmp@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/cheerio-select-tmp/-/cheerio-select-tmp-0.1.1.tgz#55bbef02a4771710195ad736d5e346763ca4e646" + integrity sha512-YYs5JvbpU19VYJyj+F7oYrIE2BOll1/hRU7rEy/5+v9BzkSo3bK81iAeeQEMI92vRIxz677m72UmJUiVwwgjfQ== dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.1" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash "^4.15.0" - parse5 "^3.0.1" + css-select "^3.1.2" + css-what "^4.0.0" + domelementtype "^2.1.0" + domhandler "^4.0.0" + domutils "^2.4.4" + +cheerio@^1.0.0-rc.2: + version "1.0.0-rc.5" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.5.tgz#88907e1828674e8f9fee375188b27dadd4f0fa2f" + integrity sha512-yoqps/VCaZgN4pfXtenwHROTp8NG6/Hlt4Jpz2FEP0ZJQ+ZUkVDd0hAPDNKhj3nakpfPt/CNs57yEtxD1bXQiw== + dependencies: + cheerio-select-tmp "^0.1.0" + dom-serializer "~1.2.0" + domhandler "^4.0.0" + entities "~2.1.0" + htmlparser2 "^6.0.0" + parse5 "^6.0.0" + parse5-htmlparser2-tree-adapter "^6.0.0" chokidar@3.3.0: version "3.3.0" @@ -1847,9 +1700,9 @@ chokidar@3.3.0: fsevents "~2.1.1" chokidar@^3.4.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" - integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -1859,7 +1712,7 @@ chokidar@^3.4.0: normalize-path "~3.0.0" readdirp "~3.5.0" optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.1" chownr@^1.1.1: version "1.1.4" @@ -1935,12 +1788,11 @@ cli-table3@^0.6.0: colors "^1.1.2" cli-table@^0.3.1: - version "0.3.4" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.4.tgz#5b37fd723751f1a6e9e70d55953a75e16eab958e" - integrity sha512-1vinpnX/ZERcmE443i3SZTmU5DF0rPO9DrL4I2iVAllhxzCM9SzPlHnz19fsZB78htkKZvYBvj6SZ6vXnaxmTA== + version "0.3.5" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.5.tgz#643508c1d6b6e7b02c82c18afd5fcc8b6dab3ca6" + integrity sha512-7uo2+RMNQUZ13M199udxqwk1qxTOS53EUak4gmu/aioUpdH5RvBz0JkJslcWz6ABKedZNqXXzikMZgHh+qF16A== dependencies: - chalk "^2.4.1" - string-width "^4.2.0" + colors "1.0.3" cli-truncate@^2.1.0: version "2.1.0" @@ -1995,6 +1847,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + colors@^1.1.2, colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" @@ -2094,9 +1951,9 @@ cookiejar@^2.1.1: integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== core-js-pure@^3.0.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.8.1.tgz#23f84048f366fdfcf52d3fd1c68fec349177d119" - integrity sha512-Se+LaxqXlVXGvmexKGPvnUIYC1jwXu1H6Pkyb3uBM5d8/NELMYCHs/4/roD7721NxrTLyv7e5nXd5/QLBO+10g== + version "3.9.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.9.0.tgz#326cc74e1fef8b7443a6a793ddb0adfcd81f9efb" + integrity sha512-3pEcmMZC9Cq0D4ZBh3pe2HLtqxpGNJBLXF/kZ2YzK17RbKp94w0HFbdbSx8H8kAlZG5k76hvLrkPm57Uyef+kg== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2210,20 +2067,21 @@ crypto-js@^3.1.9-1: resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= +css-select@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz#d52cbdc6fee379fba97fb0d3925abbd18af2d9d8" + integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA== dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" + boolbase "^1.0.0" + css-what "^4.0.0" + domhandler "^4.0.0" + domutils "^2.4.3" + nth-check "^2.0.0" -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== +css-what@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233" + integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A== d@1, d@^1.0.1: version "1.0.1" @@ -2259,7 +2117,7 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -2401,59 +2259,40 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== +dom-serializer@^1.0.1, dom-serializer@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1" + integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA== dependencies: domelementtype "^2.0.1" + domhandler "^4.0.0" entities "^2.0.0" -dom-serializer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: +domelementtype@^2.0.1, domelementtype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= +domhandler@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.0.0.tgz#01ea7821de996d85f69029e81fa873c21833098e" + integrity sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA== dependencies: - dom-serializer "0" - domelementtype "1" + domelementtype "^2.1.0" -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== +domutils@^2.4.3, domutils@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.4.tgz#282739c4b150d022d34699797369aad8d19bbbd3" + integrity sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA== dependencies: - dom-serializer "0" - domelementtype "1" + dom-serializer "^1.0.1" + domelementtype "^2.0.1" + domhandler "^4.0.0" drbg.js@^1.0.1: version "1.0.1" @@ -2482,7 +2321,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -elliptic@6.5.3, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: +elliptic@6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== @@ -2495,6 +2334,19 @@ elliptic@6.5.3, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -2535,12 +2387,12 @@ enquirer@^2.3.0, enquirer@^2.3.5, enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== @@ -2564,40 +2416,25 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.2: - version "1.17.7" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" - integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.1: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.0.2" has "^1.0.3" has-symbols "^1.0.1" is-callable "^1.2.2" - is-negative-zero "^2.0.0" + is-negative-zero "^2.0.1" is-regex "^1.1.1" - object-inspect "^1.8.0" + object-inspect "^1.9.0" object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -2656,10 +2493,10 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -eslint-config-prettier@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9" - integrity sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg== +eslint-config-prettier@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz#4ef1eaf97afe5176e6a75ddfb57c335121abc5a6" + integrity sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw== eslint-plugin-prettier@^3.3.1: version "3.3.1" @@ -2750,13 +2587,13 @@ eslint@^5.6.0: table "^5.2.3" text-table "^0.2.0" -eslint@^7.18.0: - version "7.18.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.18.0.tgz#7fdcd2f3715a41fe6295a16234bd69aed2c75e67" - integrity sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ== +eslint@^7.20.0: + version "7.21.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.21.0.tgz#4ecd5b8c5b44f5dedc9b8a110b01bbfeb15d1c83" + integrity sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg== dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.3.0" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.0" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -2767,9 +2604,9 @@ eslint@^7.18.0: eslint-utils "^2.1.0" eslint-visitor-keys "^2.0.0" espree "^7.3.1" - esquery "^1.2.0" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^6.0.0" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" globals "^12.1.0" @@ -2821,10 +2658,10 @@ esprima@^4.0.0, esprima@~4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.0.1, esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" @@ -2869,12 +2706,12 @@ eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0: js-sha3 "^0.5.7" eth-gas-reporter@^0.2.20: - version "0.2.20" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.20.tgz#431c144f00cd01cc29ce211a10a4e5a539a84e25" - integrity sha512-gp/PhKrr3hYEEFg5emIQxbhQkVH2mg+iHcM6GvqhzFx5IkZGeQx+5oNzYDEfBXQefcA90rwWHId6eCty6jbdDA== + version "0.2.21" + resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.21.tgz#8cb879a1085bf180d38ac46bb5e4cd99c774c99c" + integrity sha512-lSl9wjxPCxhDcvwvF1UwKHAUtOpjm9Lr/Can3GuxB18mACtkIlrHe3PDwt0kpYvvFvHjxiG5dO9cjovaIa+8gQ== dependencies: "@ethersproject/abi" "^5.0.0-beta.146" - "@solidity-parser/parser" "^0.8.2" + "@solidity-parser/parser" "^0.11.1" cli-table3 "^0.5.0" colors "^1.1.2" ethereumjs-util "6.2.0" @@ -2920,27 +2757,23 @@ eth-lib@^0.1.26: xhr-request-promise "^0.1.2" eth-sig-util@^2.5.2: - version "2.5.3" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.3.tgz#6938308b38226e0b3085435474900b03036abcbe" - integrity sha512-KpXbCKmmBUNUTGh9MRKmNkIPietfhzBqqYqysDavLseIiMUGl95k6UcPEkALAZlj41e9E6yioYXc1PC333RKqw== + version "2.5.4" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5" + integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A== dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" + ethereumjs-abi "0.6.8" ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" + tweetnacl "^1.0.3" tweetnacl-util "^0.15.0" -eth-sig-util@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.0.tgz#75133b3d7c20a5731af0690c385e184ab942b97e" - integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ== +eth-sig-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-3.0.1.tgz#8753297c83a3f58346bd13547b59c4b2cd110c96" + integrity sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ== dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" + ethereumjs-abi "^0.6.8" ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" + tweetnacl "^1.0.3" tweetnacl-util "^0.15.0" ethashjs@~0.0.7: @@ -2954,9 +2787,9 @@ ethashjs@~0.0.7: miller-rabin "^4.0.0" ethereum-bloom-filters@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz#b7b80735e385dbb7f944ce6b4533e24511306060" - integrity sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.9.tgz#4a59dead803af0c9e33834170bd7695df67061ec" + integrity sha512-GiK/RQkAkcVaEdxKVkPcG07PQ5vD7v2MFSHgZmBJSfMzNRHimntdBithsHAT89tAXnIpzVDWt8iaCD1DvkaxGg== dependencies: js-sha3 "^0.8.0" @@ -2993,15 +2826,7 @@ ethereum-ens@^0.8.0: underscore "^1.8.3" web3 "^1.0.0-beta.34" -ethereumjs-abi@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" - integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= - dependencies: - bn.js "^4.10.0" - ethereumjs-util "^4.3.0" - -ethereumjs-abi@^0.6.8: +ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== @@ -3018,7 +2843,7 @@ ethereumjs-account@^3.0.0: rlp "^2.2.1" safe-buffer "^5.1.1" -ethereumjs-block@^2.2.0, ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.2: +ethereumjs-block@^2.2.2, ethereumjs-block@~2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== @@ -3084,17 +2909,6 @@ ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumj ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^4.3.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" - integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== - dependencies: - bn.js "^4.8.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - rlp "^2.0.0" - ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" @@ -3108,10 +2922,10 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.2.0: rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.3, ethereumjs-util@^7.0.7: - version "7.0.7" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.7.tgz#484fb9c03b766b2ee64821281070616562fb5a59" - integrity sha512-vU5rtZBlZsgkTw3o6PDKyB8li2EgLavnAbsKcfsH2YhHH1Le+PP8vEiMnAnvgc1B6uMoaM5GDCrVztBw0Q5K9g== +ethereumjs-util@^7.0.2, ethereumjs-util@^7.0.3, ethereumjs-util@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.8.tgz#5258762b7b17e3d828e41834948363ff0a703ffd" + integrity sha512-JJt7tDpCAmDPw/sGoFYeq0guOVqT3pTE9xlEbBmc/nlCij3JRCoS2c96SQ6kXVHOT3xWUNLDm5QCJLQaUnVAtQ== dependencies: "@types/bn.js" "^4.11.3" bn.js "^5.1.2" @@ -3135,41 +2949,41 @@ ethers@^4.0.0-beta.1, ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.26: - version "5.0.26" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.26.tgz#ef43c6b6aad71f10c1a184003f69b142d7d03bae" - integrity sha512-MqA8Fvutn3qEW0yBJOHeV6KZmRpF2rqlL2B5058AGkUFsuu6j5Ns/FRlMsbGeQwBz801IB23jQp7vjRfFsKSkg== - dependencies: - "@ethersproject/abi" "5.0.10" - "@ethersproject/abstract-provider" "5.0.8" - "@ethersproject/abstract-signer" "5.0.11" - "@ethersproject/address" "5.0.9" - "@ethersproject/base64" "5.0.7" - "@ethersproject/basex" "5.0.7" - "@ethersproject/bignumber" "5.0.13" - "@ethersproject/bytes" "5.0.9" - "@ethersproject/constants" "5.0.8" - "@ethersproject/contracts" "5.0.9" - "@ethersproject/hash" "5.0.10" - "@ethersproject/hdnode" "5.0.8" - "@ethersproject/json-wallets" "5.0.10" - "@ethersproject/keccak256" "5.0.7" - "@ethersproject/logger" "5.0.8" - "@ethersproject/networks" "5.0.7" - "@ethersproject/pbkdf2" "5.0.7" - "@ethersproject/properties" "5.0.7" - "@ethersproject/providers" "5.0.19" - "@ethersproject/random" "5.0.7" - "@ethersproject/rlp" "5.0.7" - "@ethersproject/sha2" "5.0.7" - "@ethersproject/signing-key" "5.0.8" - "@ethersproject/solidity" "5.0.8" - "@ethersproject/strings" "5.0.8" - "@ethersproject/transactions" "5.0.9" - "@ethersproject/units" "5.0.9" - "@ethersproject/wallet" "5.0.10" - "@ethersproject/web" "5.0.12" - "@ethersproject/wordlists" "5.0.8" +ethers@^5.0.31: + version "5.0.31" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.31.tgz#60e3b1425864fe5d2babc147ede01be8382a7d2a" + integrity sha512-zpq0YbNFLFn+t+ibS8UkVWFeK5w6rVMSvbSHrHAQslfazovLnQ/mc2gdN5+6P45/k8fPgHrfHrYvJ4XvyK/S1A== + dependencies: + "@ethersproject/abi" "5.0.12" + "@ethersproject/abstract-provider" "5.0.9" + "@ethersproject/abstract-signer" "5.0.13" + "@ethersproject/address" "5.0.10" + "@ethersproject/base64" "5.0.8" + "@ethersproject/basex" "5.0.8" + "@ethersproject/bignumber" "5.0.14" + "@ethersproject/bytes" "5.0.10" + "@ethersproject/constants" "5.0.9" + "@ethersproject/contracts" "5.0.11" + "@ethersproject/hash" "5.0.11" + "@ethersproject/hdnode" "5.0.9" + "@ethersproject/json-wallets" "5.0.11" + "@ethersproject/keccak256" "5.0.8" + "@ethersproject/logger" "5.0.9" + "@ethersproject/networks" "5.0.8" + "@ethersproject/pbkdf2" "5.0.8" + "@ethersproject/properties" "5.0.8" + "@ethersproject/providers" "5.0.23" + "@ethersproject/random" "5.0.8" + "@ethersproject/rlp" "5.0.8" + "@ethersproject/sha2" "5.0.8" + "@ethersproject/signing-key" "5.0.10" + "@ethersproject/solidity" "5.0.9" + "@ethersproject/strings" "5.0.9" + "@ethersproject/transactions" "5.0.10" + "@ethersproject/units" "5.0.10" + "@ethersproject/wallet" "5.0.11" + "@ethersproject/web" "5.0.13" + "@ethersproject/wordlists" "5.0.9" ethjs-abi@^0.2.1: version "0.2.1" @@ -3337,9 +3151,9 @@ fast-diff@^1.1.2: integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== fast-glob@^3.0.3: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3359,9 +3173,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" - integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + version "1.11.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" + integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== dependencies: reusify "^1.0.4" @@ -3386,10 +3200,10 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -file-entry-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.0.tgz#7921a89c391c6d93efec2169ac6bf300c527ea0a" - integrity sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" @@ -3440,21 +3254,6 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-versions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965" - integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ== - dependencies: - semver-regex "^3.1.2" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -3485,9 +3284,9 @@ flatted@^2.0.0: integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatted@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" - integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== flow-stoplight@^1.0.0: version "1.0.0" @@ -3495,9 +3294,16 @@ flow-stoplight@^1.0.0: integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= follow-redirects@^1.12.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" - integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== + version "1.13.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" + integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" foreach@^2.0.5: version "2.0.5" @@ -3543,9 +3349,9 @@ fp-ts@^1.0.0: integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== fp-ts@^2.7.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.9.1.tgz#24557f66f9221f8a1922fce6cbe2b8ea6d0f3929" - integrity sha512-9++IpEtF2blK7tfSV+iHxO3KXdAGO/bPPQtUYqzC6XKzGOWNctqvlf13SpXxcu2mYaibOvneh/m9vAPLAHdoRQ== + version "2.9.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.9.5.tgz#6690cd8b76b84214a38fc77cbbbd04a38f86ea90" + integrity sha512-MiHrA5teO6t8zKArE3DdMPT/Db6v2GUt5yfWnhBTrrsVfeCJUUnV6sgFvjGNBKDmEMqVwRFkEePL7wPwqrLKKA== fresh@0.5.2: version "0.5.2" @@ -3607,31 +3413,27 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.1.1, fsevents@~2.1.2: +fsevents@~2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -ganache-cli@^6.11.0: - version "6.12.1" - resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.1.tgz#148cf6541494ef1691bd68a77e4414981910cb3e" - integrity sha512-zoefZLQpQyEJH9jgtVYgM+ENFLAC9iwys07IDCsju2Ieq9KSTLH89RxSP4bhizXKV/h/+qaWpfyCBGWnBfqgIQ== - dependencies: - ethereumjs-util "6.2.1" - source-map-support "0.5.12" - yargs "13.2.4" + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -ganache-cli@^6.12.2: +ganache-cli@^6.11.0: version "6.12.2" resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.12.2.tgz#c0920f7db0d4ac062ffe2375cb004089806f627a" integrity sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw== @@ -3650,10 +3452,10 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= -get-intrinsic@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" - integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -3832,10 +3634,10 @@ got@^7.1.0: url-parse-lax "^1.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== growl@1.10.5: version "1.10.5" @@ -3843,9 +3645,9 @@ growl@1.10.5: integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1: - version "4.7.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" - integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== dependencies: minimist "^1.2.5" neo-async "^2.6.0" @@ -3888,12 +3690,12 @@ hardhat-gas-reporter@^1.0.4: eth-gas-reporter "^0.2.20" sha1 "^1.1.1" -hardhat@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.8.tgz#6ec232293dd6b3ca7baeadb095ba4afce4b9b2e0" - integrity sha512-2tDAtOfshrBzP103dx7PQrhTwv2sqjhQStZAPwkkQTic25o2EH6HYE2++LuOG98YwqSjr0WvhvdBvKl3dCSkYA== +hardhat@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.0.11.tgz#f7bc9d38045ecda58665dcf1ffae9ff940712f06" + integrity sha512-K3cyXV/F0reT0Lu7fHHBAgVOVenUaYa6uCNvzYbFnjKH+s8O4CEdrsFQ/yIbmLgMpC2EQeuBSwb+8ZhWVj8AGQ== dependencies: - "@nomiclabs/ethereumjs-vm" "^4.1.1" + "@nomiclabs/ethereumjs-vm" "4.2.2" "@sentry/node" "^5.18.1" "@solidity-parser/parser" "^0.11.0" "@types/bn.js" "^4.11.5" @@ -3911,10 +3713,10 @@ hardhat@^2.0.8: ethereum-cryptography "^0.1.2" ethereumjs-abi "^0.6.8" ethereumjs-account "^3.0.0" - ethereumjs-block "^2.2.0" + ethereumjs-block "^2.2.2" ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.1" - ethereumjs-util "^6.1.0" + ethereumjs-tx "^2.1.2" + ethereumjs-util "^6.2.0" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" @@ -3922,7 +3724,7 @@ hardhat@^2.0.8: immutable "^4.0.0-rc.12" io-ts "1.10.4" lodash "^4.17.11" - merkle-patricia-tree "^3.0.0" + merkle-patricia-tree "3.0.0" mocha "^7.1.2" node-fetch "^2.6.0" qs "^6.7.0" @@ -3964,9 +3766,9 @@ has-symbol-support-x@^1.4.1: integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-to-string-tag-x@^1.2.0: version "1.4.1" @@ -4012,32 +3814,22 @@ he@1.2.0, he@^1.1.1: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -highlight.js@^10.4.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.5.0.tgz#3f09fede6a865757378f2d9ebdcbc15ba268f98f" - integrity sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw== - -highlight.js@^10.4.1: - version "10.4.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.1.tgz#d48fbcf4a9971c4361b3f95f302747afe19dbad0" - integrity sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg== +highlight.js@^10.4.0, highlight.js@^10.4.1: + version "10.6.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.6.0.tgz#0073aa71d566906965ba6e1b7be7b2682f5e18b6" + integrity sha512-8mlRcn5vk/r4+QcqerapwBYTe+iPL5ih6xrNylxrnBdHQiijDETfXX7VIxC3UiCRiINBJfANBAsPzAvRQj8RpQ== highlight.js@^9.15.8: version "9.18.5" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA== -highlightjs-solidity@^1.0.18: - version "1.0.19" - resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-1.0.19.tgz#a2f05bcfadd295a8eefb9cc20dcb18a3ba48e49c" - integrity sha512-ZIzMlxZxkcNnzWC1LeOeUjQjywzXnGyDxexOPKzz8hWFqdE2uRvz1BxD0joOkr41z4SU2ABXVGDx6EWlbzTBLQ== +highlightjs-solidity@^1.0.18, highlightjs-solidity@^1.0.21: + version "1.0.21" + resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-1.0.21.tgz#6d257215b5b635231d4d0c523f2c419bbff6fe42" + integrity sha512-ozOtTD986CBIxuIuauzz2lqCOTpd27TbfYm+msMtNSB69mJ0cdFNvZ6rOO5iFtEHtDkVYVEFQywXffG2sX3XTw== -highlightjs-solidity@^1.0.20: - version "1.0.20" - resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-1.0.20.tgz#37482fd47deda617994e1d1262df5a319c0a8580" - integrity sha512-Ixb87/4huazRJ7mriimL0DP2GvE5zgSk11VdMPGKMQCNwszDe8qK0PySySsuB88iXyDT/H2gdmvC2bgfrOi3qQ== - -hmac-drbg@^1.0.0: +hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= @@ -4046,17 +3838,15 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -htmlparser2@^3.9.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== +htmlparser2@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.0.0.tgz#c2da005030390908ca4c91e5629e418e0665ac01" + integrity sha512-numTQtDZMoh78zJpaNdJ9MXb2cv5G3jwUoe3dMQODubZvLoGvTE/Ofp6sHvH8OGKcN/8A47pGLi/k58xHP/Tfw== dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.4.4" + entities "^2.0.0" http-basic@^8.1.1: version "8.1.3" @@ -4129,21 +3919,10 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -husky@^4.3.8: - version "4.3.8" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d" - integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow== - dependencies: - chalk "^4.0.0" - ci-info "^2.0.0" - compare-versions "^3.6.0" - cosmiconfig "^7.0.0" - find-versions "^4.0.0" - opencollective-postinstall "^2.0.2" - pkg-dir "^5.0.0" - please-upgrade-node "^3.2.0" - slash "^3.0.0" - which-pm-runs "^1.0.0" +husky@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-5.1.1.tgz#8678953fd8deb86f387cbf1ad50bb2f7f96e83f2" + integrity sha512-80LZ736V0Nr4/st0c2COYaMbEQhHNmAbLMN8J/kLk7/mo0QdUkUGNDjv/7jVkhug377Wh8wfbWyaVXEJ/h2B/Q== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -4198,9 +3977,9 @@ import-fresh@^2.0.0: resolve-from "^3.0.0" import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" - integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -4275,9 +4054,9 @@ io-ts@1.10.4: fp-ts "^1.0.0" io-ts@^2.2.9: - version "2.2.13" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.13.tgz#e04016685e863dd5cffb2b5262c5c9c74432dfda" - integrity sha512-BYJgE/BanovJKDvCnAkrr7f3gTucSyk+Sr5VtpouBO1/YfBKUyIn2z1ODG8LEF+1D4sjKZ3Bd/A5/v8JrJe5UQ== + version "2.2.15" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.15.tgz#0b0b19a6f8a64f4a524ad5810d56432789428128" + integrity sha512-ww2ZPrErx5pjCCI/tWRwjlEIDEndnN9kBIxAylXj+WNIH4ZVgaUqFuabGouehkRuvrmvzO5OnZmLf+o50h4izQ== ipaddr.js@1.9.1: version "1.9.1" @@ -4308,12 +4087,12 @@ is-buffer@~2.0.3: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== -is-core-module@^2.1.0: +is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== @@ -4367,7 +4146,7 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= -is-negative-zero@^2.0.0: +is-negative-zero@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== @@ -4393,10 +4172,11 @@ is-plain-obj@^1.1.0: integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== dependencies: + call-bind "^1.0.2" has-symbols "^1.0.1" is-regexp@^1.0.0: @@ -4427,13 +4207,13 @@ is-symbol@^1.0.2: has-symbols "^1.0.1" is-typed-array@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.4.tgz#1f66f34a283a3c94a4335434661ca53fff801120" - integrity sha512-ILaRgn4zaSrVNXNGtON6iFNotXW3hAPF3+0fB1usg2jFlWqo5fEDdmJkz0zBfoi7Dgskr8Khi2xZ8cXqZEfXNA== + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" + integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== dependencies: available-typed-arrays "^1.0.2" - call-bind "^1.0.0" - es-abstract "^1.18.0-next.1" + call-bind "^1.0.2" + es-abstract "^1.18.0-next.2" foreach "^2.0.5" has-symbols "^1.0.1" @@ -4564,9 +4344,9 @@ json-text-sequence@~0.1.0: delimit-stream "0.1.0" json5@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" @@ -4772,10 +4552,10 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= -lint-staged@10.5.3: - version "10.5.3" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.3.tgz#c682838b3eadd4c864d1022da05daa0912fb1da5" - integrity sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg== +lint-staged@10.5.4: + version "10.5.4" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-10.5.4.tgz#cd153b5f0987d2371fc1d2847a409a2fe705b665" + integrity sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg== dependencies: chalk "^4.1.0" cli-truncate "^2.1.0" @@ -4794,9 +4574,9 @@ lint-staged@10.5.3: stringify-object "^3.3.0" listr2@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.2.3.tgz#ef9e0d790862f038dde8a9837be552b1adfd1c07" - integrity sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w== + version "3.3.4" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.3.4.tgz#bca480e784877330b9d96d6cdc613ad243332e20" + integrity sha512-b0lhLAvXSr63AtPF9Dgn6tyxm8Kiz6JXpVGM0uZJdnDcZp02jt7FehgAnMfA9R7riQimOKjQgLknBTdz2nmXwQ== dependencies: chalk "^4.1.0" cli-truncate "^2.1.0" @@ -4804,8 +4584,9 @@ listr2@^3.2.2: indent-string "^4.0.0" log-update "^4.0.0" p-map "^4.0.0" - rxjs "^6.6.3" + rxjs "^6.6.6" through "^2.3.8" + wrap-ansi "^7.0.0" locate-path@^2.0.0: version "2.0.0" @@ -4830,13 +4611,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -4872,10 +4646,10 @@ lodash.toarray@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= -lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@3.0.0: version "3.0.0" @@ -5036,7 +4810,20 @@ merge2@^1.2.3, merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: +merkle-patricia-tree@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" + integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== + dependencies: + async "^2.6.1" + ethereumjs-util "^5.2.0" + level-mem "^3.0.1" + level-ws "^1.0.0" + readable-stream "^3.0.6" + rlp "^2.0.0" + semaphore ">=1.0.1" + +merkle-patricia-tree@^2.1.2: version "2.3.2" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== @@ -5050,19 +4837,6 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz#448d85415565df72febc33ca362b8b614f5a58f8" - integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== - dependencies: - async "^2.6.1" - ethereumjs-util "^5.2.0" - level-mem "^3.0.1" - level-ws "^1.0.0" - readable-stream "^3.0.6" - rlp "^2.0.0" - semaphore ">=1.0.1" - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -5084,17 +4858,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== +mime-db@1.46.0: + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== dependencies: - mime-db "1.44.0" + mime-db "1.46.0" mime@1.6.0: version "1.6.0" @@ -5354,6 +5128,13 @@ nofilter@^1.0.4: resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== +nofilter@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-2.0.3.tgz#f5460f3cb33147005883e3f5d4476239501fa187" + integrity sha512-FbuXC+lK+GU2+63D1kC1ETiZo+Z7SIi7B+mxKTCH1byrh6WFvfBCN/wpherFz0a0bjGd7EKTst/cz0yLeNngug== + dependencies: + "@cto.af/textdecoder" "^0.0.0" + nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -5385,12 +5166,12 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== +nth-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125" + integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== dependencies: - boolbase "~1.0.0" + boolbase "^1.0.0" number-to-bn@1.7.0: version "1.7.0" @@ -5410,7 +5191,7 @@ object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-inspect@^1.8.0: +object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== @@ -5435,7 +5216,7 @@ object.assign@4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.assign@^4.1.1: +object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -5445,14 +5226,14 @@ object.assign@^4.1.1: has-symbols "^1.0.1" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" - integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + es-abstract "^1.18.0-next.2" oboe@2.1.4: version "2.1.4" @@ -5496,11 +5277,6 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -opencollective-postinstall@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== - optionator@^0.8.1, optionator@^0.8.2: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -5578,13 +5354,6 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -5606,13 +5375,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -5679,21 +5441,26 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" - integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse5@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" - integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA== +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== dependencies: - "@types/node" "*" + parse5 "^6.0.1" + +parse5@^6.0.0, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parseurl@~1.3.3: version "1.3.3" @@ -5746,9 +5513,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== pbkdf2@^3.0.17, pbkdf2@^3.0.3: version "3.1.1" @@ -5776,13 +5543,6 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -5850,11 +5610,11 @@ promise@^8.0.0, promise@^8.0.2: asap "~2.0.6" proper-lockfile@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.1.tgz#284cf9db9e30a90e647afad69deb7cb06881262c" - integrity sha512-1w6rxXodisVpn7QYvLk706mzprPTAPCYAqxMvctmPN3ekuRk/kuGkGc82pangZiAt4R3lwSuUzheTTn0/Yb7Zg== + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== dependencies: - graceful-fs "^4.1.11" + graceful-fs "^4.2.4" retry "^0.12.0" signal-exit "^3.0.2" @@ -5912,9 +5672,9 @@ qs@6.7.0: integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== qs@^6.4.0, qs@^6.7.0: - version "6.9.4" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" - integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== + version "6.9.6" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" + integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== qs@~6.5.2: version "6.5.2" @@ -5930,6 +5690,11 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" +queue-microtask@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" + integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -5993,7 +5758,7 @@ readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.2.8, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -6161,11 +5926,11 @@ resolve@1.17.0: path-parse "^1.0.6" resolve@^1.1.6: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: - is-core-module "^2.1.0" + is-core-module "^2.2.0" path-parse "^1.0.6" responselike@^1.0.2: @@ -6243,19 +6008,21 @@ run-async@^2.2.0: integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" - integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rxjs@^6.4.0, rxjs@^6.6.3: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== +rxjs@^6.4.0, rxjs@^6.6.6: + version "6.6.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" + integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg== dependencies: tslib "^1.9.0" @@ -6337,11 +6104,6 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -semver-regex@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807" - integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA== - semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -6561,17 +6323,17 @@ solhint@^3.3.2: optionalDependencies: prettier "^1.14.3" -solidity-ast@^0.4.4: - version "0.4.15" - resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.15.tgz#d9f12760c1c8a69f2b0d72a56972fcc79f3b82d6" - integrity sha512-VFedJMLf5yTLKpJZ2bZBYnnrVYaxUTTvv7mpdWz9k9SuV2N/1kcHX/nBokdkI4lf3z05/3us+Q1pLP02EjJxqQ== +solidity-ast@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/solidity-ast/-/solidity-ast-0.4.17.tgz#e857b4f64466f3eb94da78fe961c0d256c84b228" + integrity sha512-5jkkabmjPdy9W9c2DMQBlKobVBz7KDnipxn+0zW191uD6BML3w7dQ+ihUvwA9XOm9ILDECrb5Y8z2vu47STqCg== -solidity-coverage@^0.7.13: - version "0.7.13" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.13.tgz#eca0659e857aef25580742ae1fae9bdc1d9f3dd4" - integrity sha512-06r0R+/j8lgl5/Z57VwxWNFZId0ZavcQU45W2gCfsBmEt/1Y6Xgm96oMSa6JBIvwrPR8H4T3icxTLiUVsMFNeg== +solidity-coverage@^0.7.15: + version "0.7.15" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.15.tgz#c5974e92b665d5be6bee11c24bbf7f6ff7529fa2" + integrity sha512-MVcpEUyMjf+ITew3BS7fI/NRxpYJUg9wPrSLS7y/F7BwXpYVRgAK4WsjbMzVkRdmezta1Kon0XqYHZMLgEt9XA== dependencies: - "@solidity-parser/parser" "^0.8.1" + "@solidity-parser/parser" "^0.11.0" "@truffle/provider" "^0.2.24" chalk "^2.4.2" death "^1.1.0" @@ -6684,28 +6446,28 @@ string-width@^3.0.0, string-width@^3.1.0: strip-ansi "^5.1.0" string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + version "4.2.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.1.tgz#1933ce1f470973d224368009bd1316cad81d5f4f" + integrity sha512-LL0OLyN6AnfV9xqGQpDBwedT2Rt63737LxvsRxbcwpa2aIeynBApG2Sm//F3TaLHIR1aJBN52DWklc06b94o5Q== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== +string.prototype.trimend@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" -string.prototype.trimstart@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== +string.prototype.trimstart@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" string_decoder@^1.1.1: @@ -7008,7 +6770,7 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -tweetnacl@^1.0.0: +tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== @@ -7061,9 +6823,9 @@ type@^1.0.1: integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== type@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" - integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.3.0.tgz#ada7c045f07ead08abf9e2edd29be1a0c0661132" + integrity sha512-rgPIqOdfK/4J9FhiVrZ3cveAjRRo5rsQBAIhnylX874y1DX/kEKSVdLsnuHB6l1KTjHyU01VjiMBHgU2adejyg== typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -7078,9 +6840,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= uglify-js@^3.1.4: - version "3.12.2" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.2.tgz#c7ae89da0ed1bb58999c7fce07190b347fdbdaba" - integrity sha512-rWYleAvfJPjduYCt+ELvzybNah/zIkRteGXIBO8X0lteRZPGladF61hFi8tU7qKTsF7u6DUQCtT9k00VlFOgkg== + version "3.12.8" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.8.tgz#a82e6e53c9be14f7382de3d068ef1e26e7d4aaf8" + integrity sha512-fvBeuXOsvqjecUtF/l1dwsrrf5y2BCUk9AOJGzGcm6tE7vegku5u/YvqjyDaAGr422PLoLnrxg3EnRvTqsdC1w== ultron@~1.1.0: version "1.1.1" @@ -7108,9 +6870,9 @@ unpipe@1.0.0, unpipe@~1.0.0: integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -7144,9 +6906,9 @@ url-to-options@^1.0.1: integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= utf-8-validate@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.3.tgz#3b64e418ad2ff829809025fdfef595eab2f03a27" - integrity sha512-jtJM6fpGv8C1SoH4PtG22pGto6x+Y8uPprW0tw3//gGFhDDTiuksgradgFN6yRayDP4SyZZa6ZMGHLIa17+M8A== + version "5.0.4" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.4.tgz#72a1735983ddf7a05a43a9c6b67c5ce1c910f9b8" + integrity sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q== dependencies: node-gyp-build "^4.2.0" @@ -7161,14 +6923,15 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= util.promisify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.2" + for-each "^0.3.3" has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" + object.getownpropertydescriptors "^2.1.1" util@^0.12.0: version "0.12.3" @@ -7236,20 +6999,10 @@ web3-bzz@1.2.9: swarm-js "^0.1.40" underscore "1.9.1" -web3-bzz@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.0.tgz#83dfd77fa8a64bbb660462dffd0fee2a02ef1051" - integrity sha512-ibYAnKab+sgTo/UdfbrvYfWblXjjgSMgyy9/FHa6WXS14n/HVB+HfWqGz2EM3fok8Wy5XoKGMvdqvERQ/mzq1w== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - underscore "1.9.1" - -web3-bzz@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.3.tgz#e3d9c8ff5db4d61fe3a4b7b7b93d61000c0e4322" - integrity sha512-lFERlqnr/upJhADT6US7BGUkM5cy6idw86/GvWKo9h/uyrbV14gk+bUqcQdBBSopa1Mvvy5ZaO6rKtRe8PTsQw== +web3-bzz@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.3.4.tgz#9be529353c4063bc68395370cb5d8e414c6b6c87" + integrity sha512-DBRVQB8FAgoAtZCpp2GAGPCJjgBgsuwOKEasjV044AAZiONpXcKHbkO6G1SgItIixnrJsRJpoGLGw52Byr6FKw== dependencies: "@types/node" "^12.12.6" got "9.6.0" @@ -7265,23 +7018,14 @@ web3-core-helpers@1.2.9: web3-eth-iban "1.2.9" web3-utils "1.2.9" -web3-core-helpers@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz#697cc3246a7eaaaac64ea506828d861c981c3f31" - integrity sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.3.0" - web3-utils "1.3.0" - -web3-core-helpers@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.3.tgz#58a7a34278e4b338dde9520012679d5952701a69" - integrity sha512-rUTC9sgn1Wvw2KGBtc9/bsQKUd+yjzIm14mlaqqiO0vpFueTmmagwiGRE2CWzEfYg+r2jnYIIgh9qnsCykgVkQ== +web3-core-helpers@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.4.tgz#b8549740bf24d5c71688d89c3cdd802d8d36b4e4" + integrity sha512-n7BqDalcTa1stncHMmrnFtyTgDhX5Fy+avNaHCf6qcOP2lwTQC8+mdHVBONWRJ6Yddvln+c8oY/TAaB6PzWK0A== dependencies: underscore "1.9.1" - web3-eth-iban "1.3.3" - web3-utils "1.3.3" + web3-eth-iban "1.3.4" + web3-utils "1.3.4" web3-core-method@1.2.9: version "1.2.9" @@ -7295,29 +7039,17 @@ web3-core-method@1.2.9: web3-core-subscriptions "1.2.9" web3-utils "1.2.9" -web3-core-method@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.0.tgz#a71387af842aec7dbad5dbbd1130c14cc6c8beb3" - integrity sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.3.0" - web3-core-promievent "1.3.0" - web3-core-subscriptions "1.3.0" - web3-utils "1.3.0" - -web3-core-method@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.3.tgz#f992744180e003d0ca55b1b17b4a9678cb9f7247" - integrity sha512-d3AA1lyw0dvLs53X17pHpD5QpxJdkfolbN31UQymRF5Y+swFweqRiCuJoNTplE95ZX2uUtsLhEIbaszj7dQgFg== +web3-core-method@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.4.tgz#6c2812d96dd6c811b9e6c8a5d25050d2c22b9527" + integrity sha512-JxmQrujsAWYRRN77P/RY7XuZDCzxSiiQJrgX/60Lfyf7FF1Y0le4L/UMCi7vUJnuYkbU1Kfl9E0udnqwyPqlvQ== dependencies: "@ethersproject/transactions" "^5.0.0-beta.135" underscore "1.9.1" - web3-core-helpers "1.3.3" - web3-core-promievent "1.3.3" - web3-core-subscriptions "1.3.3" - web3-utils "1.3.3" + web3-core-helpers "1.3.4" + web3-core-promievent "1.3.4" + web3-core-subscriptions "1.3.4" + web3-utils "1.3.4" web3-core-promievent@1.2.9: version "1.2.9" @@ -7326,17 +7058,10 @@ web3-core-promievent@1.2.9: dependencies: eventemitter3 "3.1.2" -web3-core-promievent@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz#e0442dd0a8989b6bdce09293976cee6d9237a484" - integrity sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.3.tgz#b6dcede41965a35ad53041f4f16c6ef7865bf13c" - integrity sha512-ARgO+BWUCxK8U/977SdJ8oyJo51mDYUzlZFoa2NFjUH+QYrFoKA7l9Hhw/vxhy13jE2LaVUM31JBLzVb+GM9dQ== +web3-core-promievent@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.4.tgz#d166239012d91496cdcbe91d5d54071ea818bc73" + integrity sha512-V61dZIeBwogg6hhZZUt0qL9hTp1WDhnsdjP++9fhTDr4vy/Gz8T5vibqT2LLg6lQC8i+Py33yOpMeMNjztaUaw== dependencies: eventemitter3 "4.0.4" @@ -7351,28 +7076,17 @@ web3-core-requestmanager@1.2.9: web3-providers-ipc "1.2.9" web3-providers-ws "1.2.9" -web3-core-requestmanager@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz#c5b9a0304504c0e6cce6c90bc1a3bff82732aa1f" - integrity sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.3.0" - web3-providers-http "1.3.0" - web3-providers-ipc "1.3.0" - web3-providers-ws "1.3.0" - -web3-core-requestmanager@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.3.tgz#deaf18307ddf0e292ac783b5486d2f6e2480a9ac" - integrity sha512-4/J23wK5IXRw/1kqda7FXtvySKjX7Phcevqjx0EkcBtrxAfLedcqf8k2PlDh5LtCXfPW66u4V3fDgHdLZMrVgQ== +web3-core-requestmanager@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.4.tgz#e105ced735c2b5fcedd5771e0ecf9879ae9c373f" + integrity sha512-xriouCrhVnVDYQ04TZXdEREZm0OOJzkSEsoN5bu4JYsA6e/HzROeU+RjDpMUxFMzN4wxmFZ+HWbpPndS3QwMag== dependencies: underscore "1.9.1" util "^0.12.0" - web3-core-helpers "1.3.3" - web3-providers-http "1.3.3" - web3-providers-ipc "1.3.3" - web3-providers-ws "1.3.3" + web3-core-helpers "1.3.4" + web3-providers-http "1.3.4" + web3-providers-ipc "1.3.4" + web3-providers-ws "1.3.4" web3-core-subscriptions@1.2.9: version "1.2.9" @@ -7383,23 +7097,14 @@ web3-core-subscriptions@1.2.9: underscore "1.9.1" web3-core-helpers "1.2.9" -web3-core-subscriptions@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz#c2622ccd2b84f4687475398ff966b579dba0847e" - integrity sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.3.0" - -web3-core-subscriptions@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.3.tgz#296752e7cfad5a559162eea4dbc9086e4e24e62d" - integrity sha512-VvcPuNYcGLb6HfgMrNN6Q/1CwSk2uIqUjhrVTQ67JIxIddsEdV1f6SsQH9MX1cmwi39ffGsYtssOT1pht4Zc8g== +web3-core-subscriptions@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.4.tgz#7b00e92bde21f792620cd02e6e508fcf4f4c31d3" + integrity sha512-drVHVDxh54hv7xmjIm44g4IXjfGj022fGw4/meB5R2D8UATFI40F73CdiBlyqk3DysP9njDOLTJFSQvEkLFUOg== dependencies: eventemitter3 "4.0.4" underscore "1.9.1" - web3-core-helpers "1.3.3" + web3-core-helpers "1.3.4" web3-core@1.2.9: version "1.2.9" @@ -7414,31 +7119,18 @@ web3-core@1.2.9: web3-core-requestmanager "1.2.9" web3-utils "1.2.9" -web3-core@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.0.tgz#b818903738461c1cca0163339e1d6d3fa51242cf" - integrity sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-core-requestmanager "1.3.0" - web3-utils "1.3.0" - -web3-core@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.3.tgz#c012792d82a26743c068658a9fed56894501e396" - integrity sha512-hCDWj/3PBHhSJSSBi+nV7MiW9Djf/pRuUXcVO2jWroAXqAbTSXLHpju0AWTzXnlsqs1QHK0Yk8nF9jojGUQVYg== +web3-core@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.4.tgz#2cc7ba7f35cc167f7a0a46fd5855f86e51d34ce8" + integrity sha512-7OJu46RpCEfTerl+gPvHXANR2RkLqAfW7l2DAvQ7wN0pnCzl9nEfdgW6tMhr31k3TR2fWucwKzCyyxMGzMHeSA== dependencies: "@types/bn.js" "^4.11.5" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.3.3" - web3-core-method "1.3.3" - web3-core-requestmanager "1.3.3" - web3-utils "1.3.3" + web3-core-helpers "1.3.4" + web3-core-method "1.3.4" + web3-core-requestmanager "1.3.4" + web3-utils "1.3.4" web3-eth-abi@1.2.9: version "1.2.9" @@ -7449,23 +7141,14 @@ web3-eth-abi@1.2.9: underscore "1.9.1" web3-utils "1.2.9" -web3-eth-abi@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz#387b7ea9b38be69ad8856bc7b4e9a6a69bb4d22b" - integrity sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.3.0" - -web3-eth-abi@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.3.tgz#21dbebc7c50d66cb61195f13ece9262601a2b5b7" - integrity sha512-9GQ7YTALt1uxGwdMBpBHlagCj4yn0fPUT2wDDAGoyJFVJMsUt3arF855zsVpJL3zfhHmUgRNoVrAkobRR2YYLw== +web3-eth-abi@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.4.tgz#10f5d8b6080dbb6cbaa1bcef7e0c70573da6566f" + integrity sha512-PVSLXJ2dzdXsC+R24llIIEOS6S1KhG5qwNznJjJvXZFe3sqgdSe47eNvwUamZtCBjcrdR/HQr+L/FTxqJSf80Q== dependencies: "@ethersproject/abi" "5.0.7" underscore "1.9.1" - web3-utils "1.3.3" + web3-utils "1.3.4" web3-eth-accounts@1.2.9: version "1.2.9" @@ -7484,27 +7167,10 @@ web3-eth-accounts@1.2.9: web3-core-method "1.2.9" web3-utils "1.2.9" -web3-eth-accounts@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.0.tgz#010acf389b2bee6d5e1aecb2fe78bfa5c8f26c7a" - integrity sha512-/Q7EVW4L2wWUbNRtOTwAIrYvJid/5UnKMw67x/JpvRMwYC+e+744P536Ja6SG4X3MnzFvd3E/jruV4qa6k+zIw== - dependencies: - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-js "^3.0.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-utils "1.3.0" - -web3-eth-accounts@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.3.tgz#1fda75f55bdb780765d627315fe9f499a27fda28" - integrity sha512-Jn9nguNsCLnY7Po6lv7Mg5JDaYuKdvL0Ezv1V2LTLy+EhcVt5i19h+/3M92Xynpe5Tx+WY/ELfeA2jLTeP5jRg== +web3-eth-accounts@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.3.4.tgz#cf513d78531c13ce079a5e7862820570350e79a5" + integrity sha512-gz9ReSmQEjqbYAjpmAx+UZF4CVMbyS4pfjSYWGAnNNI+Xz0f0u0kCIYXQ1UEaE+YeLcYiE+ZlZdgg6YoatO5nA== dependencies: crypto-browserify "3.12.0" eth-lib "0.2.8" @@ -7513,10 +7179,10 @@ web3-eth-accounts@1.3.3: scrypt-js "^3.0.1" underscore "1.9.1" uuid "3.3.2" - web3-core "1.3.3" - web3-core-helpers "1.3.3" - web3-core-method "1.3.3" - web3-utils "1.3.3" + web3-core "1.3.4" + web3-core-helpers "1.3.4" + web3-core-method "1.3.4" + web3-utils "1.3.4" web3-eth-contract@1.2.9: version "1.2.9" @@ -7533,35 +7199,20 @@ web3-eth-contract@1.2.9: web3-eth-abi "1.2.9" web3-utils "1.2.9" -web3-eth-contract@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.0.tgz#c758340ac800788e29fa29edc8b0c0ac957b741c" - integrity sha512-3SCge4SRNCnzLxf0R+sXk6vyTOl05g80Z5+9/B5pERwtPpPWaQGw8w01vqYqsYBKC7zH+dxhMaUgVzU2Dgf7bQ== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-core-promievent "1.3.0" - web3-core-subscriptions "1.3.0" - web3-eth-abi "1.3.0" - web3-utils "1.3.0" - -web3-eth-contract@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.3.tgz#a89944b04eb40227b3490cb5f807cb95c0e48eeb" - integrity sha512-TKGs1qvc/v7TriyGKtnTqVrB3J/mWSeqLkWtLY60lGqY8KopZ9k7dZ/g5Cvfiox57VHWkpOk0xDwUQjlIe4Ikg== +web3-eth-contract@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.4.tgz#1ea2dd71be0c4a9cf4772d4f75dbb2fa99751472" + integrity sha512-Fvy8ZxUksQY2ePt+XynFfOiSqxgQtMn4m2NJs6VXRl2Inl17qyRi/nIJJVKTcENLocm+GmZ/mxq2eOE5u02nPg== dependencies: "@types/bn.js" "^4.11.5" underscore "1.9.1" - web3-core "1.3.3" - web3-core-helpers "1.3.3" - web3-core-method "1.3.3" - web3-core-promievent "1.3.3" - web3-core-subscriptions "1.3.3" - web3-eth-abi "1.3.3" - web3-utils "1.3.3" + web3-core "1.3.4" + web3-core-helpers "1.3.4" + web3-core-method "1.3.4" + web3-core-promievent "1.3.4" + web3-core-subscriptions "1.3.4" + web3-eth-abi "1.3.4" + web3-utils "1.3.4" web3-eth-ens@1.2.9: version "1.2.9" @@ -7578,35 +7229,20 @@ web3-eth-ens@1.2.9: web3-eth-contract "1.2.9" web3-utils "1.2.9" -web3-eth-ens@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.0.tgz#0887ba38473c104cf5fb8a715828b3b354fa02a2" - integrity sha512-WnOru+EcuM5dteiVYJcHXo/I7Wq+ei8RrlS2nir49M0QpYvUPGbCGgTbifcjJQTWamgORtWdljSA1s2Asdb74w== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-promievent "1.3.0" - web3-eth-abi "1.3.0" - web3-eth-contract "1.3.0" - web3-utils "1.3.0" - -web3-eth-ens@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.3.tgz#88c8d061c2f5eeeeea3736ef0712451d76b5091b" - integrity sha512-tresrI1CM6RbxsUCM6kfG1W10LDMqWJnU+lNhfaD5mt5IzJ4GcfDAHO9WzoYl8Esh+Epj/jD+vI30clI4j90Vg== +web3-eth-ens@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.3.4.tgz#a7e4bb18481fb0e2ce5bfb3b3da2fbb0ad78cefe" + integrity sha512-b0580tQyQwpV2wyacwQiBEfQmjCUln5iPhge3IBIMXaI43BUNtH3lsCL9ERFQeOdweB4o+6rYyNYr6xbRcSytg== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" underscore "1.9.1" - web3-core "1.3.3" - web3-core-helpers "1.3.3" - web3-core-promievent "1.3.3" - web3-eth-abi "1.3.3" - web3-eth-contract "1.3.3" - web3-utils "1.3.3" + web3-core "1.3.4" + web3-core-helpers "1.3.4" + web3-core-promievent "1.3.4" + web3-eth-abi "1.3.4" + web3-eth-contract "1.3.4" + web3-utils "1.3.4" web3-eth-iban@1.2.9: version "1.2.9" @@ -7616,21 +7252,13 @@ web3-eth-iban@1.2.9: bn.js "4.11.8" web3-utils "1.2.9" -web3-eth-iban@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz#15b782dfaf273ebc4e3f389f1367f4e88ddce4a5" - integrity sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw== - dependencies: - bn.js "^4.11.9" - web3-utils "1.3.0" - -web3-eth-iban@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.3.tgz#ad3e4e30a2a101febfeed0248a107889a13372ec" - integrity sha512-+9a+bZHAKQ4oBcRxiGbC1MC8S2cOgDlXo8qcw0XpMhLJZ3c/brZM7ZbPdiuU8Z7AMYf3PknaGFQyVmedZhrauA== +web3-eth-iban@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.4.tgz#5eb7a564e0dcf68730d68f48f95dd207cd173d81" + integrity sha512-Y7/hLjVvIN/OhaAyZ8L/hxbTqVX6AFTl2RwUXR6EEU9oaLydPcMjAx/Fr8mghUvQS3QJSr+UGubP3W4SkyNiYw== dependencies: bn.js "^4.11.9" - web3-utils "1.3.3" + web3-utils "1.3.4" web3-eth-personal@1.2.9: version "1.2.9" @@ -7644,29 +7272,17 @@ web3-eth-personal@1.2.9: web3-net "1.2.9" web3-utils "1.2.9" -web3-eth-personal@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.0.tgz#d376e03dc737d961ff1f8d1aca866efad8477135" - integrity sha512-2czUhElsJdLpuNfun9GeLiClo5O6Xw+bLSjl3f4bNG5X2V4wcIjX2ygep/nfstLLtkz8jSkgl/bV7esANJyeRA== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-net "1.3.0" - web3-utils "1.3.0" - -web3-eth-personal@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.3.tgz#45ecf0a6fcb2bca0a7a4de11d4c2ed405579ee44" - integrity sha512-S/TSGTm7x9oHRXUHXi8f+y187RKpn5aqYJRlSoyTmB3B4EMrv9NcZZQmHaiXwM48wkFdRhTMECW1Ar8E5zZLFw== +web3-eth-personal@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.3.4.tgz#0d0e0abea3447283d7ee5658ed312990c9bf48dd" + integrity sha512-JiTbaktYVk1j+S2EDooXAhw5j/VsdvZfKRmHtXUe/HizPM9ETXmj1+ne4RT6m+950jQ7DJwUF3XU1FKYNtEDwQ== dependencies: "@types/node" "^12.12.6" - web3-core "1.3.3" - web3-core-helpers "1.3.3" - web3-core-method "1.3.3" - web3-net "1.3.3" - web3-utils "1.3.3" + web3-core "1.3.4" + web3-core-helpers "1.3.4" + web3-core-method "1.3.4" + web3-net "1.3.4" + web3-utils "1.3.4" web3-eth@1.2.9: version "1.2.9" @@ -7687,43 +7303,24 @@ web3-eth@1.2.9: web3-net "1.2.9" web3-utils "1.2.9" -web3-eth@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.0.tgz#898e5f5a8827f9bc6844e267a52eb388916a6771" - integrity sha512-/bzJcxXPM9EM18JM5kO2JjZ3nEqVo3HxqU93aWAEgJNqaP/Lltmufl2GpvIB2Hvj+FXAjAXquxUdQ2/xP7BzHQ== - dependencies: - underscore "1.9.1" - web3-core "1.3.0" - web3-core-helpers "1.3.0" - web3-core-method "1.3.0" - web3-core-subscriptions "1.3.0" - web3-eth-abi "1.3.0" - web3-eth-accounts "1.3.0" - web3-eth-contract "1.3.0" - web3-eth-ens "1.3.0" - web3-eth-iban "1.3.0" - web3-eth-personal "1.3.0" - web3-net "1.3.0" - web3-utils "1.3.0" - -web3-eth@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.3.tgz#e03d1a4a7ea97b36c63bb54f000ebe0ef9f140c7" - integrity sha512-NvbkCaN26o7f9EogsRsA/lbwF+8dXimJWsaGpZK3ANa+AZrYkWj3NuaxfPO/S/RLsC9ptJdt7id72qxT40r5QQ== +web3-eth@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.3.4.tgz#7c4607685e66a1c43e3e315e526c959f24f96907" + integrity sha512-8OIVMLbvmx+LB5RZ4tDhXuFGWSdNMrCZ4HM0+PywQ08uEcmAcqTMFAn4vdPii+J8gCatZR501r1KdzX3SDLoPw== dependencies: underscore "1.9.1" - web3-core "1.3.3" - web3-core-helpers "1.3.3" - web3-core-method "1.3.3" - web3-core-subscriptions "1.3.3" - web3-eth-abi "1.3.3" - web3-eth-accounts "1.3.3" - web3-eth-contract "1.3.3" - web3-eth-ens "1.3.3" - web3-eth-iban "1.3.3" - web3-eth-personal "1.3.3" - web3-net "1.3.3" - web3-utils "1.3.3" + web3-core "1.3.4" + web3-core-helpers "1.3.4" + web3-core-method "1.3.4" + web3-core-subscriptions "1.3.4" + web3-eth-abi "1.3.4" + web3-eth-accounts "1.3.4" + web3-eth-contract "1.3.4" + web3-eth-ens "1.3.4" + web3-eth-iban "1.3.4" + web3-eth-personal "1.3.4" + web3-net "1.3.4" + web3-utils "1.3.4" web3-net@1.2.9: version "1.2.9" @@ -7734,23 +7331,14 @@ web3-net@1.2.9: web3-core-method "1.2.9" web3-utils "1.2.9" -web3-net@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.0.tgz#b69068cccffab58911c2f08ca4abfbefb0f948c6" - integrity sha512-Xz02KylOyrB2YZzCkysEDrY7RbKxb7LADzx3Zlovfvuby7HBwtXVexXKtoGqksa+ns1lvjQLLQGb+OeLi7Sr7w== - dependencies: - web3-core "1.3.0" - web3-core-method "1.3.0" - web3-utils "1.3.0" - -web3-net@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.3.tgz#dacfe2456d0584ed1500e98bdd12082353883cd6" - integrity sha512-GcPj2lyAC5CP6FOCwoURCRMFsh0khWBi6sGqiKtUPMa7dKnLw8CLCAFcwX//d3ucnn1E7I78Va6k8liKjj87sA== +web3-net@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.3.4.tgz#d76158bf0b4a7b3b14352b4f95472db9efc57a2a" + integrity sha512-wVyqgVC3Zt/0uGnBiR3GpnsS8lvOFTDgWZMxAk9C6Guh8aJD9MUc7pbsw5rHrPUVe6S6RUfFJvh/Xq8oMIQgSw== dependencies: - web3-core "1.3.3" - web3-core-method "1.3.3" - web3-utils "1.3.3" + web3-core "1.3.4" + web3-core-method "1.3.4" + web3-utils "1.3.4" web3-providers-http@1.2.9: version "1.2.9" @@ -7760,20 +7348,12 @@ web3-providers-http@1.2.9: web3-core-helpers "1.2.9" xhr2-cookies "1.1.0" -web3-providers-http@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.0.tgz#88227f64c88b32abed4359383c2663616e0dc531" - integrity sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA== - dependencies: - web3-core-helpers "1.3.0" - xhr2-cookies "1.1.0" - -web3-providers-http@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.3.tgz#55c15c79ecd7f5415d2d0d0f748ff4304ba23edd" - integrity sha512-V2x27IFXQqsaZrAbA4GJurKuyrNXapmmpSJ7jxPDOxewOy9dEURlKIg5W1bb4QXGh2YSCksuH9fKquvTfPfc/A== +web3-providers-http@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.4.tgz#89389e18e27148faa2fef58842740ffadbdda8cc" + integrity sha512-aIg/xHXvxpqpFU70sqfp+JC3sGkLfAimRKTUhG4oJZ7U+tTcYTHoxBJj+4A3Id4JAoKiiv0k1/qeyQ8f3rMC3g== dependencies: - web3-core-helpers "1.3.3" + web3-core-helpers "1.3.4" xhr2-cookies "1.1.0" web3-providers-ipc@1.2.9: @@ -7785,23 +7365,14 @@ web3-providers-ipc@1.2.9: underscore "1.9.1" web3-core-helpers "1.2.9" -web3-providers-ipc@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz#d7c2b203733b46f7b4e7b15633d891648cf9a293" - integrity sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og== - dependencies: - oboe "2.1.5" - underscore "1.9.1" - web3-core-helpers "1.3.0" - -web3-providers-ipc@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.3.tgz#b3e1f30875e9c71e94c23be264ed4d9c50313f37" - integrity sha512-XMQo/YsH/2lBaRlkYa5d/Q+2EJ2RTzVjio1i2G9TESESfHCj0l2AWLb3zet+f/QRVxfvXGmGlZuf99diof2a1g== +web3-providers-ipc@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.4.tgz#b963518989b1b7847063cdd461ff73b83855834a" + integrity sha512-E0CvXEJElr/TIlG1YfJeO3Le5NI/4JZM+1SsEdiPIfBUAJN18oOoum138EBGKv5+YaLKZUtUuJSXWjIIOR/0Ig== dependencies: oboe "2.1.5" underscore "1.9.1" - web3-core-helpers "1.3.3" + web3-core-helpers "1.3.4" web3-providers-ws@1.2.9: version "1.2.9" @@ -7813,24 +7384,14 @@ web3-providers-ws@1.2.9: web3-core-helpers "1.2.9" websocket "^1.0.31" -web3-providers-ws@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz#84adeff65acd4624d7f5bb43c5b2b22d8f0f63a4" - integrity sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.3.0" - websocket "^1.0.32" - -web3-providers-ws@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.3.tgz#f654ee83444d141c365eee7fba6985590b674ba5" - integrity sha512-yuzqB3jST9JS19oOR1FRaARM7JBeP6cbKffM8HoWp4Y98/OowjW1mbDQVS47YTSHBP2QiLzSrwBxjIEPm8f48Q== +web3-providers-ws@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.4.tgz#b94c2e0ec51a0c472abdec53a472b5bf8176bec1" + integrity sha512-WBd9hk2fUAdrbA3kUyUk94ZeILtE6txLeoVVvIKAw2bPegx+RjkLyxC1Du0oceKgQ/qQWod8CCzl1E/GgTP+MQ== dependencies: eventemitter3 "4.0.4" underscore "1.9.1" - web3-core-helpers "1.3.3" + web3-core-helpers "1.3.4" websocket "^1.0.32" web3-shh@1.2.9: @@ -7843,25 +7404,15 @@ web3-shh@1.2.9: web3-core-subscriptions "1.2.9" web3-net "1.2.9" -web3-shh@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.0.tgz#62d15297da8fb5f733dd1b98f9ade300590f4d49" - integrity sha512-IZTojA4VCwVq+7eEIHuL1tJXtU+LJDhO8Y2QmuwetEWW1iBgWCGPHZasipWP+7kDpSm/5lo5GRxL72FF/Os/tA== - dependencies: - web3-core "1.3.0" - web3-core-method "1.3.0" - web3-core-subscriptions "1.3.0" - web3-net "1.3.0" - -web3-shh@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.3.tgz#55e4e6826b5af51b60708969da268c76a960f2bd" - integrity sha512-byp2+sHnc8UAj6sNcVFacF3pmRzIaMATsI4ARfU+0S8EpaQ3trojww2QBYPnZ4r0QOMH+I6+bVl8qTu0Zz4eoA== +web3-shh@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.3.4.tgz#b7d29e118f26416c1a74575e585be379cc01a77a" + integrity sha512-zoeww5mxLh3xKcqbX85irQbtFe5pc5XwrgjvmdMkhkOdZzPASlWOgqzUFtaPykpLwC3yavVx4jG5RqifweXLUA== dependencies: - web3-core "1.3.3" - web3-core-method "1.3.3" - web3-core-subscriptions "1.3.3" - web3-net "1.3.3" + web3-core "1.3.4" + web3-core-method "1.3.4" + web3-core-subscriptions "1.3.4" + web3-net "1.3.4" web3-utils@1.2.9: version "1.2.9" @@ -7877,24 +7428,10 @@ web3-utils@1.2.9: underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.3.0, web3-utils@^1.2.5, web3-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.0.tgz#5bac16e5e0ec9fe7bdcfadb621655e8aa3cf14e1" - integrity sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.3.tgz#71b837958f1fcc970223eb14a1d0110233348305" - integrity sha512-ZwpdqEcBBzqRgXUbCj+kyu1jFnsDauURSQ79yVqgnTKSI4C3s0Qjpp4WLThV+LKhCKR5GZtBTkgGHeiq0FT88A== +web3-utils@1.3.4, web3-utils@^1.2.5, web3-utils@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.4.tgz#9b1aa30d7549f860b573e7bb7e690999e7192198" + integrity sha512-/vC2v0MaZNpWooJfpRw63u0Y3ag2gNjAWiLtMSL6QQLmCqCy4SQIndMt/vRyx0uMoeGt1YTwSXEcHjUzOhLg0A== dependencies: bn.js "^4.11.9" eth-lib "0.2.8" @@ -7918,31 +7455,18 @@ web3@1.2.9: web3-shh "1.2.9" web3-utils "1.2.9" -web3@^1.0.0-beta.34, web3@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.0.tgz#8fe4cd6e2a21c91904f343ba75717ee4c76bb349" - integrity sha512-4q9dna0RecnrlgD/bD1C5S+81Untbd6Z/TBD7rb+D5Bvvc0Wxjr4OP70x+LlnwuRDjDtzBwJbNUblh2grlVArw== - dependencies: - web3-bzz "1.3.0" - web3-core "1.3.0" - web3-eth "1.3.0" - web3-eth-personal "1.3.0" - web3-net "1.3.0" - web3-shh "1.3.0" - web3-utils "1.3.0" - -web3@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.3.tgz#be2dda6f58b177c00275fc19529f7465b1460687" - integrity sha512-fI/g0yC1FC0m4envv8FsPh7tbBoe/eXbEho+iY/hahs7YGgGt3nYNrAFTkR9pLhQaVMpOilhwgFxXEp+O7My/g== +web3@^1.0.0-beta.34, web3@^1.2.5, web3@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.3.4.tgz#31e014873360aa5840eb17f9f171190c967cffb7" + integrity sha512-D6cMb2EtTMLHgdGbkTPGl/Qi7DAfczR+Lp7iFX3bcu/bsD9V8fZW69hA8v5cRPNGzXUwVQebk3bS17WKR4cD2w== dependencies: - web3-bzz "1.3.3" - web3-core "1.3.3" - web3-eth "1.3.3" - web3-eth-personal "1.3.3" - web3-net "1.3.3" - web3-shh "1.3.3" - web3-utils "1.3.3" + web3-bzz "1.3.4" + web3-core "1.3.4" + web3-eth "1.3.4" + web3-eth-personal "1.3.4" + web3-net "1.3.4" + web3-shh "1.3.4" + web3-utils "1.3.4" websocket@^1.0.31, websocket@^1.0.32: version "1.0.33" @@ -7961,11 +7485,6 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which-pm-runs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" - integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= - which-typed-array@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" @@ -8028,6 +7547,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -8055,9 +7583,9 @@ ws@^3.0.0: ultron "~1.1.0" ws@^7.2.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.1.tgz#a333be02696bd0e54cea0434e21dcc8a9ac294bb" - integrity sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ== + version "7.4.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" + integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== xhr-request-promise@^0.1.2: version "0.1.3" @@ -8192,8 +7720,3 @@ yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==