From 5b1269c855d4f0023e659eef9d15124fe8188d6f Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Fri, 25 Aug 2023 20:06:08 +0300 Subject: [PATCH 01/12] Fix flashloan attack --- contracts/libraries/Errors.sol | 2 ++ contracts/vaults/modules/VaultImmutables.sol | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/contracts/libraries/Errors.sol b/contracts/libraries/Errors.sol index a3254a45..1b65d6a3 100644 --- a/contracts/libraries/Errors.sol +++ b/contracts/libraries/Errors.sol @@ -19,6 +19,8 @@ library Errors { error InvalidFeeRecipient(); error InvalidFeePercent(); error NotHarvested(); + error AlreadyHarvested(); + error HarvestBetweenDepositAndWithdraw(); error NotCollateralized(); error Collateralized(); error InvalidProof(); diff --git a/contracts/vaults/modules/VaultImmutables.sol b/contracts/vaults/modules/VaultImmutables.sol index c714a1e8..0986ac0a 100644 --- a/contracts/vaults/modules/VaultImmutables.sol +++ b/contracts/vaults/modules/VaultImmutables.sol @@ -42,6 +42,13 @@ abstract contract VaultImmutables { if (IKeeperRewards(_keeper).isHarvestRequired(address(this))) revert Errors.NotHarvested(); } + /** + * @dev Internal method for checking whether the vault can be harvested + */ + function _canHarvest() internal view returns (bool) { + return IKeeperRewards(_keeper).canHarvest(address(this)); + } + /** * @dev Internal method for checking whether the vault is collateralized */ From 728258ec7fea85666e8c2ea4806804b60fc467f3 Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Fri, 25 Aug 2023 20:07:08 +0300 Subject: [PATCH 02/12] Add deadline to validators approval --- abi/Errors.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/abi/Errors.json b/abi/Errors.json index 06d0c302..1fc6e964 100644 --- a/abi/Errors.json +++ b/abi/Errors.json @@ -9,6 +9,11 @@ "name": "AlreadyAdded", "type": "error" }, + { + "inputs": [], + "name": "AlreadyHarvested", + "type": "error" + }, { "inputs": [], "name": "AlreadyRemoved", @@ -34,6 +39,11 @@ "name": "DeadlineExpired", "type": "error" }, + { + "inputs": [], + "name": "HarvestBetweenDepositAndWithdraw", + "type": "error" + }, { "inputs": [], "name": "HarvestFailed", From f2dc0c667d8d178d3a8764440403e6c4dc58bee6 Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Fri, 25 Aug 2023 21:14:06 +0300 Subject: [PATCH 03/12] Fix tests --- test/EthVault.register.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/EthVault.register.spec.ts b/test/EthVault.register.spec.ts index 240b3880..57f3c322 100644 --- a/test/EthVault.register.spec.ts +++ b/test/EthVault.register.spec.ts @@ -73,11 +73,13 @@ describe('EthVault - register', () => { let validator: Buffer let proof: string[] let approvalParams: IKeeperValidators.ApprovalParamsStruct + let deadline: number beforeEach(async () => { validator = validatorsData.validators[0] proof = getValidatorProof(validatorsData.tree, validator, 0) const exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] + deadline = Math.floor(Date.now() / 1000) + 10000000 const signatures = getOraclesSignatures( getEthValidatorsSigningData( validator, @@ -162,11 +164,13 @@ describe('EthVault - register', () => { let approvalParams: IKeeperValidators.ApprovalParamsStruct let multiProof: ValidatorsMultiProof let signatures: Buffer + let deadline: number beforeEach(async () => { multiProof = getValidatorsMultiProof(validatorsData.tree, validatorsData.validators, [ ...Array(validatorsData.validators.length).keys(), ]) + deadline = Math.floor(Date.now() / 1000) + 10000000 validators = validatorsData.validators const exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] const sortedVals = multiProof.leaves.map((v) => v[0]) From ca5c0b6b224e7d09d94807669a56b1316b2470e8 Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Mon, 28 Aug 2023 19:38:51 +0300 Subject: [PATCH 04/12] Fix tests, snapshots --- test/EthVault.register.spec.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/EthVault.register.spec.ts b/test/EthVault.register.spec.ts index 57f3c322..240b3880 100644 --- a/test/EthVault.register.spec.ts +++ b/test/EthVault.register.spec.ts @@ -73,13 +73,11 @@ describe('EthVault - register', () => { let validator: Buffer let proof: string[] let approvalParams: IKeeperValidators.ApprovalParamsStruct - let deadline: number beforeEach(async () => { validator = validatorsData.validators[0] proof = getValidatorProof(validatorsData.tree, validator, 0) const exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] - deadline = Math.floor(Date.now() / 1000) + 10000000 const signatures = getOraclesSignatures( getEthValidatorsSigningData( validator, @@ -164,13 +162,11 @@ describe('EthVault - register', () => { let approvalParams: IKeeperValidators.ApprovalParamsStruct let multiProof: ValidatorsMultiProof let signatures: Buffer - let deadline: number beforeEach(async () => { multiProof = getValidatorsMultiProof(validatorsData.tree, validatorsData.validators, [ ...Array(validatorsData.validators.length).keys(), ]) - deadline = Math.floor(Date.now() / 1000) + 10000000 validators = validatorsData.validators const exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] const sortedVals = multiProof.leaves.map((v) => v[0]) From 6760d9a5fd3189a1c829f661c11e82f356c17dc6 Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Thu, 14 Sep 2023 14:19:00 +0800 Subject: [PATCH 05/12] Check collateralized and positive first state update in Genesis vault --- test/EthGenesisVault.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/EthGenesisVault.spec.ts b/test/EthGenesisVault.spec.ts index 6d667c47..12127ae0 100644 --- a/test/EthGenesisVault.spec.ts +++ b/test/EthGenesisVault.spec.ts @@ -244,6 +244,7 @@ describe('EthGenesisVault', () => { }) it('pulls assets on redeem', async () => { + await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) const shares = parseEther('10') await vault.connect(other).deposit(other.address, ZERO_ADDRESS, { value: shares }) From a5aeacadaf56f108a4f25bfa2431c377f7ff571d Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Mon, 18 Sep 2023 16:49:28 +0300 Subject: [PATCH 06/12] Do not fail harvest with same params --- abi/Errors.json | 5 ----- contracts/libraries/Errors.sol | 1 - 2 files changed, 6 deletions(-) diff --git a/abi/Errors.json b/abi/Errors.json index 1fc6e964..77ff0d1f 100644 --- a/abi/Errors.json +++ b/abi/Errors.json @@ -9,11 +9,6 @@ "name": "AlreadyAdded", "type": "error" }, - { - "inputs": [], - "name": "AlreadyHarvested", - "type": "error" - }, { "inputs": [], "name": "AlreadyRemoved", diff --git a/contracts/libraries/Errors.sol b/contracts/libraries/Errors.sol index 1b65d6a3..c79760db 100644 --- a/contracts/libraries/Errors.sol +++ b/contracts/libraries/Errors.sol @@ -19,7 +19,6 @@ library Errors { error InvalidFeeRecipient(); error InvalidFeePercent(); error NotHarvested(); - error AlreadyHarvested(); error HarvestBetweenDepositAndWithdraw(); error NotCollateralized(); error Collateralized(); From 486d67b5a92fe6f28358a84d1907014e78d5bf9e Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Sun, 8 Oct 2023 15:16:12 +0300 Subject: [PATCH 07/12] Merge redeem and enter exit queue --- abi/IEthErc20Vault.json | 32 +------------------ abi/IEthGenesisVault.json | 32 +------------------ abi/IEthPrivErc20Vault.json | 32 +------------------ abi/IEthPrivVault.json | 32 +------------------ abi/IEthVault.json | 32 +------------------ abi/IRewardSplitter.json | 32 +------------------ abi/IVaultEnterExit.json | 32 +------------------ abi/IVaultEthStaking.json | 32 +------------------ abi/IVaultOsToken.json | 32 +------------------ abi/IVaultToken.json | 32 +------------------ contracts/interfaces/IRewardSplitter.sol | 14 +------- contracts/libraries/Errors.sol | 1 - contracts/misc/RewardSplitter.sol | 13 ++------ contracts/vaults/ethereum/EthErc20Vault.sol | 22 ++----------- contracts/vaults/ethereum/EthVault.sol | 20 +----------- contracts/vaults/modules/VaultImmutables.sol | 7 ---- contracts/vaults/modules/VaultOsToken.sol | 13 ++------ test/EthErc20Vault.spec.ts | 2 +- test/EthGenesisVault.spec.ts | 3 +- .../EthVault.settings.spec.ts.snap | 6 ++-- 20 files changed, 23 insertions(+), 398 deletions(-) diff --git a/abi/IEthErc20Vault.json b/abi/IEthErc20Vault.json index 02df03b2..b0726a22 100644 --- a/abi/IEthErc20Vault.json +++ b/abi/IEthErc20Vault.json @@ -769,13 +769,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -1136,30 +1130,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/abi/IEthGenesisVault.json b/abi/IEthGenesisVault.json index bb1f6261..68dc0288 100644 --- a/abi/IEthGenesisVault.json +++ b/abi/IEthGenesisVault.json @@ -665,13 +665,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -957,30 +951,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/abi/IEthPrivErc20Vault.json b/abi/IEthPrivErc20Vault.json index de6b4d4c..57e48012 100644 --- a/abi/IEthPrivErc20Vault.json +++ b/abi/IEthPrivErc20Vault.json @@ -813,13 +813,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -1180,30 +1174,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/abi/IEthPrivVault.json b/abi/IEthPrivVault.json index b789fbad..0330fc0d 100644 --- a/abi/IEthPrivVault.json +++ b/abi/IEthPrivVault.json @@ -646,13 +646,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -914,30 +908,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/abi/IEthVault.json b/abi/IEthVault.json index bff98d76..ee8cb555 100644 --- a/abi/IEthVault.json +++ b/abi/IEthVault.json @@ -602,13 +602,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -870,30 +864,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/abi/IRewardSplitter.json b/abi/IRewardSplitter.json index 9d994392..cf00c26c 100644 --- a/abi/IRewardSplitter.json +++ b/abi/IRewardSplitter.json @@ -153,13 +153,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -218,30 +212,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "rewards", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/abi/IVaultEnterExit.json b/abi/IVaultEnterExit.json index 6c0e285a..17e44c65 100644 --- a/abi/IVaultEnterExit.json +++ b/abi/IVaultEnterExit.json @@ -372,13 +372,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -472,30 +466,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/abi/IVaultEthStaking.json b/abi/IVaultEthStaking.json index ad3ff60b..73a5c023 100644 --- a/abi/IVaultEthStaking.json +++ b/abi/IVaultEthStaking.json @@ -447,13 +447,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -580,30 +574,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/abi/IVaultOsToken.json b/abi/IVaultOsToken.json index d8c382d6..09424331 100644 --- a/abi/IVaultOsToken.json +++ b/abi/IVaultOsToken.json @@ -527,13 +527,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -704,30 +698,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/abi/IVaultToken.json b/abi/IVaultToken.json index 3f4d0769..5d1a179f 100644 --- a/abi/IVaultToken.json +++ b/abi/IVaultToken.json @@ -539,13 +539,7 @@ } ], "name": "enterExitQueue", - "outputs": [ - { - "internalType": "uint256", - "name": "positionTicket", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -738,30 +732,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "shares", - "type": "uint256" - }, - { - "internalType": "address", - "name": "receiver", - "type": "address" - } - ], - "name": "redeem", - "outputs": [ - { - "internalType": "uint256", - "name": "assets", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [ { diff --git a/contracts/interfaces/IRewardSplitter.sol b/contracts/interfaces/IRewardSplitter.sol index ee98fd33..73eaba02 100644 --- a/contracts/interfaces/IRewardSplitter.sol +++ b/contracts/interfaces/IRewardSplitter.sol @@ -125,20 +125,8 @@ interface IRewardSplitter is IMulticall { * @notice Sends the rewards to the exit queue * @param rewards The amount of rewards to send to the exit queue * @param receiver The address that will claim exited assets - * @return positionTicket The position ticket of the exit queue */ - function enterExitQueue( - uint256 rewards, - address receiver - ) external returns (uint256 positionTicket); - - /** - * @notice Redeems available assets from the vault - * @param rewards The amount of rewards to redeem - * @param receiver The address that will receive the redeemed assets - * @return assets The amount of assets that were redeemed - */ - function redeem(uint256 rewards, address receiver) external returns (uint256 assets); + function enterExitQueue(uint256 rewards, address receiver) external; /** * @notice Syncs the rewards from the vault to the splitter. The vault state must be up-to-date. diff --git a/contracts/libraries/Errors.sol b/contracts/libraries/Errors.sol index c79760db..a3254a45 100644 --- a/contracts/libraries/Errors.sol +++ b/contracts/libraries/Errors.sol @@ -19,7 +19,6 @@ library Errors { error InvalidFeeRecipient(); error InvalidFeePercent(); error NotHarvested(); - error HarvestBetweenDepositAndWithdraw(); error NotCollateralized(); error Collateralized(); error InvalidProof(); diff --git a/contracts/misc/RewardSplitter.sol b/contracts/misc/RewardSplitter.sol index 4030cdfc..b6953094 100644 --- a/contracts/misc/RewardSplitter.sol +++ b/contracts/misc/RewardSplitter.sol @@ -125,18 +125,9 @@ contract RewardSplitter is IRewardSplitter, Initializable, OwnableUpgradeable, M } /// @inheritdoc IRewardSplitter - function enterExitQueue( - uint256 rewards, - address receiver - ) external override returns (uint256 positionTicket) { + function enterExitQueue(uint256 rewards, address receiver) external override { _withdrawRewards(msg.sender, rewards); - return IVaultEnterExit(vault).enterExitQueue(rewards, receiver); - } - - /// @inheritdoc IRewardSplitter - function redeem(uint256 rewards, address receiver) external override returns (uint256 assets) { - _withdrawRewards(msg.sender, rewards); - return IVaultEnterExit(vault).redeem(rewards, receiver); + IVaultEnterExit(vault).enterExitQueue(rewards, receiver); } /// @inheritdoc IRewardSplitter diff --git a/contracts/vaults/ethereum/EthErc20Vault.sol b/contracts/vaults/ethereum/EthErc20Vault.sol index 0c70f06b..321cceff 100644 --- a/contracts/vaults/ethereum/EthErc20Vault.sol +++ b/contracts/vaults/ethereum/EthErc20Vault.sol @@ -104,30 +104,12 @@ contract EthErc20Vault is return success; } - /// @inheritdoc IVaultEnterExit - function redeem( - uint256 shares, - address receiver - ) - public - virtual - override(IVaultEnterExit, VaultEnterExit, VaultOsToken) - returns (uint256 assets) - { - return super.redeem(shares, receiver); - } - /// @inheritdoc IVaultEnterExit function enterExitQueue( uint256 shares, address receiver - ) - public - virtual - override(IVaultEnterExit, VaultEnterExit, VaultOsToken) - returns (uint256 positionTicket) - { - positionTicket = super.enterExitQueue(shares, receiver); + ) public virtual override(IVaultEnterExit, VaultEnterExit, VaultOsToken) { + super.enterExitQueue(shares, receiver); emit Transfer(msg.sender, address(this), shares); } diff --git a/contracts/vaults/ethereum/EthVault.sol b/contracts/vaults/ethereum/EthVault.sol index a03b2638..616f0ada 100644 --- a/contracts/vaults/ethereum/EthVault.sol +++ b/contracts/vaults/ethereum/EthVault.sol @@ -78,29 +78,11 @@ contract EthVault is ); } - /// @inheritdoc IVaultEnterExit - function redeem( - uint256 shares, - address receiver - ) - public - virtual - override(IVaultEnterExit, VaultEnterExit, VaultOsToken) - returns (uint256 assets) - { - return super.redeem(shares, receiver); - } - /// @inheritdoc IVaultEnterExit function enterExitQueue( uint256 shares, address receiver - ) - public - virtual - override(IVaultEnterExit, VaultEnterExit, VaultOsToken) - returns (uint256 positionTicket) - { + ) public virtual override(IVaultEnterExit, VaultEnterExit, VaultOsToken) { return super.enterExitQueue(shares, receiver); } diff --git a/contracts/vaults/modules/VaultImmutables.sol b/contracts/vaults/modules/VaultImmutables.sol index 0986ac0a..c714a1e8 100644 --- a/contracts/vaults/modules/VaultImmutables.sol +++ b/contracts/vaults/modules/VaultImmutables.sol @@ -42,13 +42,6 @@ abstract contract VaultImmutables { if (IKeeperRewards(_keeper).isHarvestRequired(address(this))) revert Errors.NotHarvested(); } - /** - * @dev Internal method for checking whether the vault can be harvested - */ - function _canHarvest() internal view returns (bool) { - return IKeeperRewards(_keeper).canHarvest(address(this)); - } - /** * @dev Internal method for checking whether the vault is collateralized */ diff --git a/contracts/vaults/modules/VaultOsToken.sol b/contracts/vaults/modules/VaultOsToken.sol index 34eb2fd8..40b20b0b 100644 --- a/contracts/vaults/modules/VaultOsToken.sol +++ b/contracts/vaults/modules/VaultOsToken.sol @@ -131,21 +131,12 @@ abstract contract VaultOsToken is VaultImmutables, VaultState, VaultEnterExit, I emit OsTokenRedeemed(msg.sender, owner, receiver, osTokenShares, receivedAssets); } - /// @inheritdoc IVaultEnterExit - function redeem( - uint256 shares, - address receiver - ) public virtual override(IVaultEnterExit, VaultEnterExit) returns (uint256 assets) { - assets = super.redeem(shares, receiver); - _checkOsTokenPosition(msg.sender); - } - /// @inheritdoc IVaultEnterExit function enterExitQueue( uint256 shares, address receiver - ) public virtual override(IVaultEnterExit, VaultEnterExit) returns (uint256 positionTicket) { - positionTicket = super.enterExitQueue(shares, receiver); + ) public virtual override(IVaultEnterExit, VaultEnterExit) { + super.enterExitQueue(shares, receiver); _checkOsTokenPosition(msg.sender); } diff --git a/test/EthErc20Vault.spec.ts b/test/EthErc20Vault.spec.ts index a95177cc..90ca03fb 100644 --- a/test/EthErc20Vault.spec.ts +++ b/test/EthErc20Vault.spec.ts @@ -95,7 +95,7 @@ describe('EthErc20Vault', () => { const amount = parseEther('100') await vault.connect(sender).deposit(sender.address, referrer, { value: amount }) const receiverBalanceBefore = await waffle.provider.getBalance(receiver.address) - const receipt = await vault.connect(sender).redeem(amount, receiver.address) + const receipt = await vault.connect(sender).enterExitQueue(amount, receiver.address) await expect(receipt) .to.emit(vault, 'Redeemed') .withArgs(sender.address, receiver.address, amount, amount) diff --git a/test/EthGenesisVault.spec.ts b/test/EthGenesisVault.spec.ts index 12127ae0..29da3c70 100644 --- a/test/EthGenesisVault.spec.ts +++ b/test/EthGenesisVault.spec.ts @@ -244,7 +244,6 @@ describe('EthGenesisVault', () => { }) it('pulls assets on redeem', async () => { - await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) const shares = parseEther('10') await vault.connect(other).deposit(other.address, ZERO_ADDRESS, { value: shares }) @@ -253,7 +252,7 @@ describe('EthGenesisVault', () => { expect(await vault.withdrawableAssets()).to.eq(shares) - const tx = await vault.connect(other).redeem(shares, other.address) + const tx = await vault.connect(other).enterExitQueue(shares, other.address) await expect(tx) .to.emit(vault, 'Redeemed') .withArgs(other.address, other.address, shares, shares) diff --git a/test/__snapshots__/EthVault.settings.spec.ts.snap b/test/__snapshots__/EthVault.settings.spec.ts.snap index 8136c5be..64cca404 100644 --- a/test/__snapshots__/EthVault.settings.spec.ts.snap +++ b/test/__snapshots__/EthVault.settings.spec.ts.snap @@ -3,21 +3,21 @@ exports[`EthVault - settings fee recipient can update 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 44064, + "gasUsed": 44042, } `; exports[`EthVault - settings keys manager can be updated by admin 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 53051, + "gasUsed": 53029, } `; exports[`EthVault - settings metadata IPFS hash only admin can update 1`] = ` Object { "calldataByteLength": 132, - "gasUsed": 32696, + "gasUsed": 32674, } `; From 7dac515d2de7b5ef0be64d904a67774047684883 Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Sun, 8 Oct 2023 17:15:20 +0300 Subject: [PATCH 08/12] Revert merging redeem and enter exit queue --- abi/IEthErc20Vault.json | 32 ++++++++++++++++++- abi/IEthGenesisVault.json | 32 ++++++++++++++++++- abi/IEthPrivErc20Vault.json | 32 ++++++++++++++++++- abi/IEthPrivVault.json | 32 ++++++++++++++++++- abi/IEthVault.json | 32 ++++++++++++++++++- abi/IRewardSplitter.json | 32 ++++++++++++++++++- abi/IVaultEnterExit.json | 32 ++++++++++++++++++- abi/IVaultEthStaking.json | 32 ++++++++++++++++++- abi/IVaultOsToken.json | 32 ++++++++++++++++++- abi/IVaultToken.json | 32 ++++++++++++++++++- contracts/interfaces/IRewardSplitter.sol | 14 +++++++- contracts/misc/RewardSplitter.sol | 13 ++++++-- contracts/vaults/ethereum/EthErc20Vault.sol | 22 +++++++++++-- contracts/vaults/ethereum/EthVault.sol | 20 +++++++++++- contracts/vaults/modules/VaultOsToken.sol | 13 ++++++-- test/EthErc20Vault.spec.ts | 2 +- test/EthGenesisVault.spec.ts | 2 +- .../EthVault.settings.spec.ts.snap | 6 ++-- 18 files changed, 389 insertions(+), 23 deletions(-) diff --git a/abi/IEthErc20Vault.json b/abi/IEthErc20Vault.json index b0726a22..02df03b2 100644 --- a/abi/IEthErc20Vault.json +++ b/abi/IEthErc20Vault.json @@ -769,7 +769,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -1130,6 +1136,30 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/IEthGenesisVault.json b/abi/IEthGenesisVault.json index 68dc0288..bb1f6261 100644 --- a/abi/IEthGenesisVault.json +++ b/abi/IEthGenesisVault.json @@ -665,7 +665,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -951,6 +957,30 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/IEthPrivErc20Vault.json b/abi/IEthPrivErc20Vault.json index 57e48012..de6b4d4c 100644 --- a/abi/IEthPrivErc20Vault.json +++ b/abi/IEthPrivErc20Vault.json @@ -813,7 +813,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -1174,6 +1180,30 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/IEthPrivVault.json b/abi/IEthPrivVault.json index 0330fc0d..b789fbad 100644 --- a/abi/IEthPrivVault.json +++ b/abi/IEthPrivVault.json @@ -646,7 +646,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -908,6 +914,30 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/IEthVault.json b/abi/IEthVault.json index ee8cb555..bff98d76 100644 --- a/abi/IEthVault.json +++ b/abi/IEthVault.json @@ -602,7 +602,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -864,6 +870,30 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/IRewardSplitter.json b/abi/IRewardSplitter.json index cf00c26c..9d994392 100644 --- a/abi/IRewardSplitter.json +++ b/abi/IRewardSplitter.json @@ -153,7 +153,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -212,6 +218,30 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "rewards", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/IVaultEnterExit.json b/abi/IVaultEnterExit.json index 17e44c65..6c0e285a 100644 --- a/abi/IVaultEnterExit.json +++ b/abi/IVaultEnterExit.json @@ -372,7 +372,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -466,6 +472,30 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/IVaultEthStaking.json b/abi/IVaultEthStaking.json index 73a5c023..ad3ff60b 100644 --- a/abi/IVaultEthStaking.json +++ b/abi/IVaultEthStaking.json @@ -447,7 +447,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -574,6 +580,30 @@ "stateMutability": "payable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/IVaultOsToken.json b/abi/IVaultOsToken.json index 09424331..d8c382d6 100644 --- a/abi/IVaultOsToken.json +++ b/abi/IVaultOsToken.json @@ -527,7 +527,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -698,6 +704,30 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/abi/IVaultToken.json b/abi/IVaultToken.json index 5d1a179f..3f4d0769 100644 --- a/abi/IVaultToken.json +++ b/abi/IVaultToken.json @@ -539,7 +539,13 @@ } ], "name": "enterExitQueue", - "outputs": [], + "outputs": [ + { + "internalType": "uint256", + "name": "positionTicket", + "type": "uint256" + } + ], "stateMutability": "nonpayable", "type": "function" }, @@ -732,6 +738,30 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "redeem", + "outputs": [ + { + "internalType": "uint256", + "name": "assets", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/contracts/interfaces/IRewardSplitter.sol b/contracts/interfaces/IRewardSplitter.sol index 73eaba02..ee98fd33 100644 --- a/contracts/interfaces/IRewardSplitter.sol +++ b/contracts/interfaces/IRewardSplitter.sol @@ -125,8 +125,20 @@ interface IRewardSplitter is IMulticall { * @notice Sends the rewards to the exit queue * @param rewards The amount of rewards to send to the exit queue * @param receiver The address that will claim exited assets + * @return positionTicket The position ticket of the exit queue */ - function enterExitQueue(uint256 rewards, address receiver) external; + function enterExitQueue( + uint256 rewards, + address receiver + ) external returns (uint256 positionTicket); + + /** + * @notice Redeems available assets from the vault + * @param rewards The amount of rewards to redeem + * @param receiver The address that will receive the redeemed assets + * @return assets The amount of assets that were redeemed + */ + function redeem(uint256 rewards, address receiver) external returns (uint256 assets); /** * @notice Syncs the rewards from the vault to the splitter. The vault state must be up-to-date. diff --git a/contracts/misc/RewardSplitter.sol b/contracts/misc/RewardSplitter.sol index b6953094..4030cdfc 100644 --- a/contracts/misc/RewardSplitter.sol +++ b/contracts/misc/RewardSplitter.sol @@ -125,9 +125,18 @@ contract RewardSplitter is IRewardSplitter, Initializable, OwnableUpgradeable, M } /// @inheritdoc IRewardSplitter - function enterExitQueue(uint256 rewards, address receiver) external override { + function enterExitQueue( + uint256 rewards, + address receiver + ) external override returns (uint256 positionTicket) { _withdrawRewards(msg.sender, rewards); - IVaultEnterExit(vault).enterExitQueue(rewards, receiver); + return IVaultEnterExit(vault).enterExitQueue(rewards, receiver); + } + + /// @inheritdoc IRewardSplitter + function redeem(uint256 rewards, address receiver) external override returns (uint256 assets) { + _withdrawRewards(msg.sender, rewards); + return IVaultEnterExit(vault).redeem(rewards, receiver); } /// @inheritdoc IRewardSplitter diff --git a/contracts/vaults/ethereum/EthErc20Vault.sol b/contracts/vaults/ethereum/EthErc20Vault.sol index 321cceff..0c70f06b 100644 --- a/contracts/vaults/ethereum/EthErc20Vault.sol +++ b/contracts/vaults/ethereum/EthErc20Vault.sol @@ -104,12 +104,30 @@ contract EthErc20Vault is return success; } + /// @inheritdoc IVaultEnterExit + function redeem( + uint256 shares, + address receiver + ) + public + virtual + override(IVaultEnterExit, VaultEnterExit, VaultOsToken) + returns (uint256 assets) + { + return super.redeem(shares, receiver); + } + /// @inheritdoc IVaultEnterExit function enterExitQueue( uint256 shares, address receiver - ) public virtual override(IVaultEnterExit, VaultEnterExit, VaultOsToken) { - super.enterExitQueue(shares, receiver); + ) + public + virtual + override(IVaultEnterExit, VaultEnterExit, VaultOsToken) + returns (uint256 positionTicket) + { + positionTicket = super.enterExitQueue(shares, receiver); emit Transfer(msg.sender, address(this), shares); } diff --git a/contracts/vaults/ethereum/EthVault.sol b/contracts/vaults/ethereum/EthVault.sol index 616f0ada..a03b2638 100644 --- a/contracts/vaults/ethereum/EthVault.sol +++ b/contracts/vaults/ethereum/EthVault.sol @@ -78,11 +78,29 @@ contract EthVault is ); } + /// @inheritdoc IVaultEnterExit + function redeem( + uint256 shares, + address receiver + ) + public + virtual + override(IVaultEnterExit, VaultEnterExit, VaultOsToken) + returns (uint256 assets) + { + return super.redeem(shares, receiver); + } + /// @inheritdoc IVaultEnterExit function enterExitQueue( uint256 shares, address receiver - ) public virtual override(IVaultEnterExit, VaultEnterExit, VaultOsToken) { + ) + public + virtual + override(IVaultEnterExit, VaultEnterExit, VaultOsToken) + returns (uint256 positionTicket) + { return super.enterExitQueue(shares, receiver); } diff --git a/contracts/vaults/modules/VaultOsToken.sol b/contracts/vaults/modules/VaultOsToken.sol index 40b20b0b..34eb2fd8 100644 --- a/contracts/vaults/modules/VaultOsToken.sol +++ b/contracts/vaults/modules/VaultOsToken.sol @@ -131,12 +131,21 @@ abstract contract VaultOsToken is VaultImmutables, VaultState, VaultEnterExit, I emit OsTokenRedeemed(msg.sender, owner, receiver, osTokenShares, receivedAssets); } + /// @inheritdoc IVaultEnterExit + function redeem( + uint256 shares, + address receiver + ) public virtual override(IVaultEnterExit, VaultEnterExit) returns (uint256 assets) { + assets = super.redeem(shares, receiver); + _checkOsTokenPosition(msg.sender); + } + /// @inheritdoc IVaultEnterExit function enterExitQueue( uint256 shares, address receiver - ) public virtual override(IVaultEnterExit, VaultEnterExit) { - super.enterExitQueue(shares, receiver); + ) public virtual override(IVaultEnterExit, VaultEnterExit) returns (uint256 positionTicket) { + positionTicket = super.enterExitQueue(shares, receiver); _checkOsTokenPosition(msg.sender); } diff --git a/test/EthErc20Vault.spec.ts b/test/EthErc20Vault.spec.ts index 90ca03fb..a95177cc 100644 --- a/test/EthErc20Vault.spec.ts +++ b/test/EthErc20Vault.spec.ts @@ -95,7 +95,7 @@ describe('EthErc20Vault', () => { const amount = parseEther('100') await vault.connect(sender).deposit(sender.address, referrer, { value: amount }) const receiverBalanceBefore = await waffle.provider.getBalance(receiver.address) - const receipt = await vault.connect(sender).enterExitQueue(amount, receiver.address) + const receipt = await vault.connect(sender).redeem(amount, receiver.address) await expect(receipt) .to.emit(vault, 'Redeemed') .withArgs(sender.address, receiver.address, amount, amount) diff --git a/test/EthGenesisVault.spec.ts b/test/EthGenesisVault.spec.ts index 29da3c70..6d667c47 100644 --- a/test/EthGenesisVault.spec.ts +++ b/test/EthGenesisVault.spec.ts @@ -252,7 +252,7 @@ describe('EthGenesisVault', () => { expect(await vault.withdrawableAssets()).to.eq(shares) - const tx = await vault.connect(other).enterExitQueue(shares, other.address) + const tx = await vault.connect(other).redeem(shares, other.address) await expect(tx) .to.emit(vault, 'Redeemed') .withArgs(other.address, other.address, shares, shares) diff --git a/test/__snapshots__/EthVault.settings.spec.ts.snap b/test/__snapshots__/EthVault.settings.spec.ts.snap index 64cca404..8136c5be 100644 --- a/test/__snapshots__/EthVault.settings.spec.ts.snap +++ b/test/__snapshots__/EthVault.settings.spec.ts.snap @@ -3,21 +3,21 @@ exports[`EthVault - settings fee recipient can update 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 44042, + "gasUsed": 44064, } `; exports[`EthVault - settings keys manager can be updated by admin 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 53029, + "gasUsed": 53051, } `; exports[`EthVault - settings metadata IPFS hash only admin can update 1`] = ` Object { "calldataByteLength": 132, - "gasUsed": 32674, + "gasUsed": 32696, } `; From dce60a17e3451ec262361eeaeeeab067e5f5f5a7 Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Mon, 9 Oct 2023 12:50:53 +0300 Subject: [PATCH 09/12] Upgrade minor packages to latest --- package-lock.json | 12474 ++++++++-------- package.json | 34 +- .../CumulativeMerkleDrop.spec.ts.snap | 4 +- test/__snapshots__/EthErc20Vault.spec.ts.snap | 10 +- .../EthGenesisVault.spec.ts.snap | 16 +- .../EthPrivErc20Vault.spec.ts.snap | 4 +- test/__snapshots__/EthVault.burn.spec.ts.snap | 2 +- .../EthVault.deposit.spec.ts.snap | 8 +- .../EthVault.liquidate.spec.ts.snap | 4 +- test/__snapshots__/EthVault.mint.spec.ts.snap | 6 +- .../EthVault.multicall.spec.ts.snap | 4 +- .../EthVault.redeem.spec.ts.snap | 4 +- .../EthVault.register.spec.ts.snap | 4 +- .../EthVault.settings.spec.ts.snap | 8 +- .../__snapshots__/EthVault.state.spec.ts.snap | 6 +- .../__snapshots__/EthVault.token.spec.ts.snap | 26 +- .../EthVault.upgrade.spec.ts.snap | 2 +- .../EthVault.whitelist.spec.ts.snap | 10 +- .../EthVault.withdraw.spec.ts.snap | 18 +- .../EthVaultFactory.spec.ts.snap | 16 +- test/__snapshots__/KeeperOracles.spec.ts.snap | 6 +- test/__snapshots__/KeeperRewards.spec.ts.snap | 20 +- .../KeeperValidators.spec.ts.snap | 10 +- test/__snapshots__/OsToken.spec.ts.snap | 36 +- test/__snapshots__/OsTokenConfig.spec.ts.snap | 2 +- test/__snapshots__/OwnMevEscrow.spec.ts.snap | 4 +- .../__snapshots__/RewardSplitter.spec.ts.snap | 10 +- .../RewardSplitterFactory.spec.ts.snap | 2 +- .../SharedMevEscrow.spec.ts.snap | 4 +- .../__snapshots__/VaultsRegistry.spec.ts.snap | 10 +- 30 files changed, 5974 insertions(+), 6790 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9f2f1a64..23e0738f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,8 +13,8 @@ "@openzeppelin/contracts-upgradeable": "4.9.2" }, "devDependencies": { - "@chainsafe/ssz": "0.11.1", - "@metamask/eth-sig-util": "5.1.0", + "@chainsafe/ssz": "0.13.0", + "@metamask/eth-sig-util": "7.0.0", "@nomiclabs/hardhat-ethers": "2.2.3", "@nomiclabs/hardhat-etherscan": "3.1.7", "@nomiclabs/hardhat-waffle": "2.0.6", @@ -22,20 +22,20 @@ "@openzeppelin/merkle-tree": "1.0.5", "@typechain/ethers-v5": "11.0.0", "@typechain/hardhat": "7.0.0", - "@types/mocha": "10.0.1", - "@types/node": "20.3.1", - "@typescript-eslint/eslint-plugin": "5.60.0", - "@typescript-eslint/parser": "5.60.0", - "bls-eth-wasm": "1.0.6", - "chai": "4.3.7", + "@types/mocha": "10.0.2", + "@types/node": "20.8.3", + "@typescript-eslint/eslint-plugin": "6.7.4", + "@typescript-eslint/parser": "6.7.4", + "bls-eth-wasm": "1.1.0", + "chai": "4.3.10", "dotenv": "16.3.1", - "eslint": "8.43.0", - "eslint-config-prettier": "8.8.0", - "eslint-plugin-prettier": "4.2.1", + "eslint": "8.51.0", + "eslint-config-prettier": "9.0.0", + "eslint-plugin-prettier": "5.0.0", "ethereum-waffle": "4.0.10", "ethereumjs-wallet": "1.0.2", "ethers": "5.7.2", - "hardhat": "2.14.1", + "hardhat": "2.18.0", "hardhat-abi-exporter": "2.10.1", "hardhat-contract-sizer": "2.10.0", "hardhat-gas-reporter": "1.0.9", @@ -43,14 +43,23 @@ "hardhat-spdx-license-identifier": "2.1.0", "husky": "8.0.3", "keccak256": "1.0.6", - "lint-staged": "13.2.2", + "lint-staged": "14.0.1", "mocha-chai-jest-snapshot": "1.1.4", - "prettier": "2.8.8", + "prettier": "3.0.3", "prettier-plugin-solidity": "1.1.3", - "solidity-coverage": "0.8.3", + "solidity-coverage": "0.8.5", "ts-node": "10.9.1", - "typechain": "8.2.0", - "typescript": "5.1.3" + "typechain": "8.3.1", + "typescript": "5.2.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { @@ -89,11 +98,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "version": "3.425.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.425.0.tgz", + "integrity": "sha512-6lqbmorwerN4v+J5dqbHPAsjynI0mkEF+blf+69QTaKKGaxBBVaXgqoqul9RXYcK5MMrrYRbQIMd0zYOoy90kA==", "dev": true, "dependencies": { + "@smithy/types": "^2.3.4", "tslib": "^2.5.0" }, "engines": { @@ -101,9 +111,9 @@ } }, "node_modules/@aws-sdk/types/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/@aws-sdk/util-utf8-browser": { @@ -116,53 +126,54 @@ } }, "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", - "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz", - "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.0", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helpers": "^7.22.0", - "@babel/parser": "^7.22.0", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -172,13 +183,22 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", - "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, "dependencies": { - "@babel/types": "^7.22.3", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -188,171 +208,177 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", - "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.0", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", - "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", - "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz", - "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dev": true, "dependencies": { - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.3" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -360,9 +386,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", - "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -519,12 +545,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -534,33 +560,33 @@ } }, "node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", - "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.3", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.22.4", - "@babel/types": "^7.22.4", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", + "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -578,13 +604,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -608,9 +634,9 @@ } }, "node_modules/@chainsafe/ssz": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.11.1.tgz", - "integrity": "sha512-cB8dBkgGN6ZoeOKuk+rIRHKN0L5i9JLGeC0Lui71QX0TuLcQKwgbfkUexpyJxnGFatWf8yeJxlOjozMn/OTP0g==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.13.0.tgz", + "integrity": "sha512-73PF5bFXE9juLD1+dkmYV/CMO/5ip0TmyzgYw87vAn8Cn+CbwCOp/HyNNdYCmdl104a2bqcORFJzirCvvc+nNw==", "dev": true, "dependencies": { "@chainsafe/as-sha256": "^0.4.1", @@ -764,9 +790,9 @@ } }, "node_modules/@ensdomains/ens/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "peer": true, "bin": { @@ -897,23 +923,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -929,9 +955,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", - "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1097,13 +1123,13 @@ } }, "node_modules/@ethereumjs/common": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz", - "integrity": "sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz", + "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==", "dev": true, "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.3" + "@ethereumjs/util": "^8.1.0", + "crc-32": "^1.2.0" } }, "node_modules/@ethereumjs/ethash": { @@ -1132,22 +1158,26 @@ } }, "node_modules/@ethereumjs/tx": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz", - "integrity": "sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz", + "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==", "dev": true, "dependencies": { - "@ethereumjs/common": "^2.6.0", - "ethereumjs-util": "^7.1.3" + "@ethereumjs/common": "^3.2.0", + "@ethereumjs/rlp": "^4.0.1", + "@ethereumjs/util": "^8.1.0", + "ethereum-cryptography": "^2.0.0" + }, + "engines": { + "node": ">=14" } }, "node_modules/@ethereumjs/util": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.0.6.tgz", - "integrity": "sha512-zFLG/gXtF3QUC7iKFn4PT6HCr+DEnlCbwUGKGtXoqjA+64T+e0FuqMjlo4bQIY2ngRzk3EtudKdGYC4g31ehhg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", "dev": true, "dependencies": { - "@chainsafe/ssz": "^0.11.1", "@ethereumjs/rlp": "^4.0.1", "ethereum-cryptography": "^2.0.0", "micro-ftch": "^0.3.1" @@ -1176,6 +1206,26 @@ "rustbn.js": "~0.2.0" } }, + "node_modules/@ethereumjs/vm/node_modules/@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/vm/node_modules/@ethereumjs/tx": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "dev": true, + "dependencies": { + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" + } + }, "node_modules/@ethereumjs/vm/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1898,6 +1948,15 @@ "@ethersproject/strings": "^5.7.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@ganache/ethereum-address": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz", @@ -1938,10 +1997,31 @@ "ethereumjs-util": "7.1.3" } }, + "node_modules/@ganache/ethereum-utils/node_modules/@ethereumjs/common": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz", + "integrity": "sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==", + "dev": true, + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.3" + } + }, + "node_modules/@ganache/ethereum-utils/node_modules/@ethereumjs/tx": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz", + "integrity": "sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==", + "dev": true, + "dependencies": { + "@ethereumjs/common": "^2.6.0", + "ethereumjs-util": "^7.1.3" + } + }, "node_modules/@ganache/ethereum-utils/node_modules/ethereum-cryptography": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -2013,9 +2093,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2367,6 +2447,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2490,9 +2576,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2514,70 +2600,98 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "node_modules/@metamask/abi-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@metamask/abi-utils/-/abi-utils-2.0.2.tgz", + "integrity": "sha512-B/A1dY/w4F/t6cDHUscklO6ovb/ztFsrsTXFd8QlqSByk/vyy+QbPE3VVpmmyI/7RX+PA1AJcvBdzCIz+r9dVQ==", + "dev": true, + "dependencies": { + "@metamask/utils": "^8.0.0", + "superstruct": "^1.0.3" + }, + "engines": { + "node": ">=16.0.0" + } }, "node_modules/@metamask/eth-sig-util": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-5.1.0.tgz", - "integrity": "sha512-mlgziIHYlA9pi/XZerChqg4NocdOgBPB9NmxgXWQO2U2hH8RGOJQrz6j/AIKkYxgCMIE2PY000+joOwXfzeTDQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-7.0.0.tgz", + "integrity": "sha512-8KeXZB4SKx3EfNS5ahbjUMegyGvDQYk6Nk3hmM658sXpfAQR5ZlIXBgj+9RF+ZROqsU6EuNVgKt7Fr10re60PQ==", "dev": true, "dependencies": { - "@ethereumjs/util": "^8.0.6", - "bn.js": "^4.12.0", - "ethereum-cryptography": "^2.0.0", + "@ethereumjs/util": "^8.1.0", + "@metamask/abi-utils": "^2.0.2", + "@metamask/utils": "^8.1.0", + "ethereum-cryptography": "^2.1.2", "ethjs-util": "^0.1.6", "tweetnacl": "^1.0.3", "tweetnacl-util": "^0.15.1" }, "engines": { - "node": ">=14.0.0" + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/@metamask/utils": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.1.0.tgz", + "integrity": "sha512-sFNpzBKRicDgM2ZuU6vrPROlqNGm8/jDsjc5WrU1RzCkAMc4Xr3vUUf8p59uQ6B09etUWNb8d2GTCbISdmH/Ug==", + "dev": true, + "dependencies": { + "@ethereumjs/tx": "^4.1.2", + "@noble/hashes": "^1.3.1", + "@types/debug": "^4.1.7", + "debug": "^4.3.4", + "semver": "^7.5.4", + "superstruct": "^1.0.3" + }, + "engines": { + "node": ">=16.0.0" + } }, "node_modules/@noble/curves": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.0.0.tgz", - "integrity": "sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { - "@noble/hashes": "1.3.0" + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "dev": true, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", - "integrity": "sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/@noble/secp256k1": { "version": "1.7.1", @@ -2627,16 +2741,16 @@ } }, "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", - "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", + "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "ethereum-cryptography": "0.1.3", "ethers": "^5.7.1" }, @@ -2648,6 +2762,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -2668,18 +2783,18 @@ } }, "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", - "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-ethash": "3.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", + "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-ethash": "3.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "abstract-level": "^1.0.3", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", @@ -2695,6 +2810,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -2715,24 +2831,24 @@ } }, "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", - "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", + "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.2", "crc-32": "^1.2.0" } }, "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", - "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", + "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "abstract-level": "^1.0.3", "bigint-crypto-utils": "^3.0.23", "ethereum-cryptography": "0.1.3" @@ -2745,6 +2861,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -2765,15 +2882,15 @@ } }, "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", - "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", + "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", "dev": true, "dependencies": { "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", "mcl-wasm": "^0.7.1", @@ -2787,6 +2904,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -2807,9 +2925,9 @@ } }, "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", - "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", + "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", "dev": true, "bin": { "rlp": "bin/rlp" @@ -2819,13 +2937,13 @@ } }, "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", - "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", + "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", "ethers": "^5.7.1", @@ -2836,6 +2954,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -2856,13 +2975,13 @@ } }, "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", - "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", + "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "@types/readable-stream": "^2.3.13", "ethereum-cryptography": "0.1.3", "readable-stream": "^3.6.0" @@ -2875,6 +2994,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -2895,16 +3015,16 @@ } }, "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", - "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", + "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", "dev": true, "dependencies": { "@chainsafe/ssz": "^0.9.2", "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "ethereum-cryptography": "0.1.3" }, "engines": { @@ -2941,6 +3061,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -2961,13 +3082,13 @@ } }, "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", - "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", + "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", "dev": true, "dependencies": { "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", "ethereum-cryptography": "0.1.3" }, "engines": { @@ -3003,6 +3124,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -3023,20 +3145,20 @@ } }, "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", - "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", + "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-blockchain": "7.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-evm": "2.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-statemanager": "2.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", "mcl-wasm": "^0.7.1", @@ -3050,6 +3172,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -3281,6 +3404,15 @@ "hardhat": "^2.0.4" } }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@nomiclabs/hardhat-waffle": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz", @@ -3305,14 +3437,14 @@ "integrity": "sha512-siviV3PZV/fHfPaoIC51rf1Jb6iElkYWnNYZ0leO23/ukXuvOyoC/ahy8jqiV7g+++9Nuo3n/rk5ajSN/+d/Sg==" }, "node_modules/@openzeppelin/defender-base-client": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.46.0.tgz", - "integrity": "sha512-EMnVBcfE6ZN5yMxfaxrFF3eqyGp2RQp3oSRSRP+R3yuCRJf8VCc2ArdZf1QPmQQzbq70nl8EZa03mmAqPauNlQ==", + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.48.0.tgz", + "integrity": "sha512-HFO87s010hRrMjyh2xYOCEAkLe21BfIbho7n5/kikA6A1ZgXi7MsEiqnQv1zP4bxMJgxGZ5b3t4tt6fWrakbag==", "dev": true, "dependencies": { "amazon-cognito-identity-js": "^6.0.1", "async-retry": "^1.3.3", - "axios": "^0.21.2", + "axios": "^1.4.0", "lodash": "^4.17.19", "node-fetch": "^2.6.0" } @@ -3486,6 +3618,7 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.8.0.tgz", "integrity": "sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA==", + "deprecated": "@openzeppelin/platform-deploy-client is deprecated. Please use @openzeppelin/defender-sdk-deploy-client", "dev": true, "dependencies": { "@ethersproject/abi": "^5.6.3", @@ -3495,20 +3628,29 @@ "node-fetch": "^2.6.0" } }, + "node_modules/@openzeppelin/platform-deploy-client/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, "node_modules/@openzeppelin/upgrades-core": { - "version": "1.27.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.27.1.tgz", - "integrity": "sha512-6tLcu6jt0nYdJNr+LRicBgP3jp+//B+dixgB3KsvycSglCHNfmBNDf0ZQ3ZquDdLL0QQmKzIs1EBRVp6lNvPnQ==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.30.0.tgz", + "integrity": "sha512-guW3EaTp/cet/O1uAmEcupHhtEGMzzYGsru2LMllFL5INWmRfeCHSVQu4TjkCLpoYHJoOIGSvosjoCyJL4oEaQ==", "dev": true, "dependencies": { - "cbor": "^8.0.0", + "cbor": "^9.0.0", "chalk": "^4.1.0", - "compare-versions": "^5.0.0", + "compare-versions": "^6.0.0", "debug": "^4.1.1", "ethereumjs-util": "^7.0.3", "minimist": "^1.2.7", "proper-lockfile": "^4.1.1", - "solidity-ast": "^0.4.15" + "solidity-ast": "^0.4.51" }, "bin": { "openzeppelin-upgrades-core": "dist/cli/cli.js" @@ -3529,6 +3671,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@openzeppelin/upgrades-core/node_modules/cbor": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz", + "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==", + "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@openzeppelin/upgrades-core/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3584,6 +3738,32 @@ "node": ">=8" } }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/@resolver-engine/core": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", @@ -3666,48 +3846,39 @@ } }, "node_modules/@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", + "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/@scure/bip32": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.0.tgz", - "integrity": "sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", + "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { - "@noble/curves": "~1.0.0", - "@noble/hashes": "~1.3.0", + "@noble/curves": "~1.1.0", + "@noble/hashes": "~1.3.1", "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.0.tgz", - "integrity": "sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@sentry/core": { @@ -3818,6 +3989,24 @@ "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", "dev": true }, + "node_modules/@smithy/types": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.5.tgz", + "integrity": "sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==", + "dev": true, + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/@solidity-parser/parser": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", @@ -3833,7 +4022,6 @@ "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", "dev": true, "hasInstallScript": true, - "optional": true, "dependencies": { "node-gyp-build": "4.3.0" }, @@ -3936,33 +4124,33 @@ } }, "node_modules/@types/abstract-leveldown": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz", - "integrity": "sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.3.tgz", + "integrity": "sha512-YAdL8tIYbiKoFjAf/0Ir3mvRJ/iFvBP/FK0I8Xa5rGWgVcq0xWOEInzlJfs6TIPWFweEOTKgNSBdxneUcHRvaw==", "dev": true }, "node_modules/@types/babel__traverse": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", - "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", "dev": true, "peer": true }, @@ -3975,7 +4163,16 @@ "@types/node": "*" } }, - "node_modules/@types/form-data": { + "node_modules/@types/debug": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", + "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/form-data": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", @@ -3995,9 +4192,9 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", + "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", "dev": true, "dependencies": { "@types/node": "*" @@ -4010,27 +4207,27 @@ "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/level-errors": { @@ -4072,25 +4269,31 @@ } }, "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.2.tgz", + "integrity": "sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz", + "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==", "dev": true }, "node_modules/@types/node": { - "version": "20.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.1.tgz", - "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==", + "version": "20.8.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.3.tgz", + "integrity": "sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==", "dev": true }, "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", "dev": true, "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" + "form-data": "^4.0.0" } }, "node_modules/@types/pbkdf2": { @@ -4109,9 +4312,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true }, "node_modules/@types/readable-stream": { @@ -4131,24 +4334,24 @@ "dev": true }, "node_modules/@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, "node_modules/@types/sinon": { - "version": "10.0.15", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz", - "integrity": "sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==", + "version": "10.0.19", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.19.tgz", + "integrity": "sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==", "dev": true, "peer": true, "dependencies": { @@ -4156,9 +4359,9 @@ } }, "node_modules/@types/sinon-chai": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.9.tgz", - "integrity": "sha512-/19t63pFYU0ikrdbXKBWj9PCdnKyTd0Qkz0X91Ta081cYsq90OxYdcWwK/dwEoDa6dtXgj2HJfmzgq+QZTHdmQ==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.10.tgz", + "integrity": "sha512-D+VFqUjMqeku/FGl4Ioo+fDeWOaIfbZ6Oj+glgFUgz5m5RJ4kgCER3FdV1uvhmEt0A+FRz+juPdybFlg5Hxfow==", "dev": true, "peer": true, "dependencies": { @@ -4167,9 +4370,9 @@ } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz", + "integrity": "sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==", "dev": true, "peer": true }, @@ -4180,47 +4383,48 @@ "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "version": "17.0.28", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.28.tgz", + "integrity": "sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.60.0.tgz", - "integrity": "sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", + "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/type-utils": "6.7.4", + "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4228,59 +4432,27 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz", - "integrity": "sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", + "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4289,16 +4461,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz", - "integrity": "sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", + "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4306,25 +4478,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz", - "integrity": "sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", + "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/utils": "6.7.4", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4333,12 +4505,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz", - "integrity": "sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4346,21 +4518,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz", - "integrity": "sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", + "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4372,109 +4544,42 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz", - "integrity": "sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", + "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz", - "integrity": "sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.60.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.7.4", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4487,18 +4592,6 @@ "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/abstract-level": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", @@ -4594,9 +4687,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -4689,9 +4782,9 @@ } }, "node_modules/amazon-cognito-identity-js": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.1.tgz", - "integrity": "sha512-PxBdufgS8uZShrcIFAsRjmqNXsh/4fXOWUGQOUhKLHWWK1pcp/y+VeFF48avXIWefM8XwsT3JlN6m9J2eHt4LA==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.6.tgz", + "integrity": "sha512-kBq+GE6OkLrxtFj3ZduIOlKBFYeOqZK3EhxbDBkv476UTvy+uwfR0tlriTq2QzNdnvlQAjBIXnXuOM7DwR1UEQ==", "dev": true, "dependencies": { "@aws-crypto/sha256-js": "1.2.2", @@ -4839,17 +4932,38 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "node_modules/array.prototype.findlast": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.3.tgz", + "integrity": "sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4970,12 +5084,14 @@ "dev": true }, "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "dev": true, "dependencies": { - "follow-redirects": "^1.14.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/babel-plugin-istanbul": { @@ -5073,19 +5189,28 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/bigint-crypto-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", - "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", + "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", "dev": true, "engines": { "node": ">=14.0.0" } }, "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "dev": true, "engines": { "node": "*" @@ -5125,9 +5250,9 @@ "dev": true }, "node_modules/bls-eth-wasm": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/bls-eth-wasm/-/bls-eth-wasm-1.0.6.tgz", - "integrity": "sha512-XDXNaxd6CGHLLprfhbr2Yb1ctylIalDvfO28Tepk+Fa/cTEYqNAJq51hdV55PY34u9R1UX/f4RHQJAj/CPG3NA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bls-eth-wasm/-/bls-eth-wasm-1.1.0.tgz", + "integrity": "sha512-5kNu85tXD0dHEDABo05tYgCcRToBDwjn+3cAWBiJivzh2EUotdfRmgIxNrsZWnqtQjoMK56hqNmM69cxFH/Wog==", "dev": true }, "node_modules/bluebird": { @@ -5143,6 +5268,18 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", "dev": true }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5210,9 +5347,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -5229,10 +5366,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -5296,16 +5433,19 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, "dependencies": { - "streamsearch": "^1.1.0" + "run-applescript": "^5.0.0" }, "engines": { - "node": ">=10.16.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bytes": { @@ -5349,9 +5489,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001492", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz", - "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==", + "version": "1.0.30001546", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz", + "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==", "dev": true, "funding": [ { @@ -5405,18 +5545,18 @@ } }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -5446,10 +5586,13 @@ } }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -5536,15 +5679,18 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-table3": { @@ -5639,6 +5785,56 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -5650,9 +5846,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -5752,18 +5948,18 @@ } }, "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/compare-versions": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", - "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", + "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", "dev": true }, "node_modules/concat-map": { @@ -5818,9 +6014,9 @@ } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/cookie": { @@ -5833,9 +6029,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", - "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.0.tgz", + "integrity": "sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==", "dev": true, "hasInstallScript": true, "funding": { @@ -5991,6 +6187,40 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deferred-leveldown": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", @@ -6056,12 +6286,39 @@ "node": ">=6" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -6217,9 +6474,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.417", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.417.tgz", - "integrity": "sha512-8rY8HdCxuSVY8wku3i/eDac4g1b4cSbruzocenrqBlzqruAZYHjQCHIjC66dLR9DXhEHTojsC4EjhZ8KmzwXqA==", + "version": "1.4.544", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.544.tgz", + "integrity": "sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==", "dev": true }, "node_modules/elliptic": { @@ -6277,12 +6534,13 @@ } }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" @@ -6320,18 +6578,19 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -6346,37 +6605,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract/node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -6385,12 +6630,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -6405,6 +6644,15 @@ "node": ">= 0.4" } }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -6523,27 +6771,27 @@ } }, "node_modules/eslint": { - "version": "8.43.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", - "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -6553,7 +6801,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -6563,9 +6810,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -6579,9 +6825,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -6591,43 +6837,54 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">=12.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, "eslint-config-prettier": { "optional": true } } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6697,31 +6954,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6744,12 +6976,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -6785,15 +7017,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -6806,7 +7029,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -6815,15 +7038,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -6852,24 +7066,22 @@ "peer": true }, "node_modules/eth-gas-reporter": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", - "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", + "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", "dev": true, "dependencies": { - "@ethersproject/abi": "^5.0.0-beta.146", "@solidity-parser/parser": "^0.14.0", + "axios": "^1.5.1", "cli-table3": "^0.5.0", "colors": "1.4.0", "ethereum-cryptography": "^1.0.3", - "ethers": "^4.0.40", + "ethers": "^5.7.2", "fs-readdir-recursive": "^1.1.0", "lodash": "^4.17.14", "markdown-table": "^1.1.3", - "mocha": "^7.1.1", + "mocha": "^10.2.0", "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", "sha1": "^1.1.1", "sync-request": "^6.0.0" }, @@ -6927,21 +7139,6 @@ "@scure/base": "~1.1.0" } }, - "node_modules/eth-gas-reporter/node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/eth-gas-reporter/node_modules/ansi-regex": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", @@ -6951,42 +7148,6 @@ "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eth-gas-reporter/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" - } - }, "node_modules/eth-gas-reporter/node_modules/cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -7003,2463 +7164,1010 @@ "colors": "^1.1.2" } }, - "node_modules/eth-gas-reporter/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/eth-gas-reporter/node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/eth-gas-reporter/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/eth-gas-reporter/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "js-sha3": "^0.8.0" } }, - "node_modules/eth-gas-reporter/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/ethereum-cryptography": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", + "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@scure/bip32": "1.3.1", + "@scure/bip39": "1.2.1" } }, - "node_modules/eth-gas-reporter/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/eth-gas-reporter/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/ethereum-waffle": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz", + "integrity": "sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==", "dev": true, + "dependencies": { + "@ethereum-waffle/chai": "4.0.10", + "@ethereum-waffle/compiler": "4.0.3", + "@ethereum-waffle/mock-contract": "4.0.4", + "@ethereum-waffle/provider": "4.0.5", + "solc": "0.8.15", + "typechain": "^8.0.0" + }, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "waffle": "bin/waffle" }, "engines": { - "node": ">=4" + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*" } }, - "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", "dev": true, "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dev": true, "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "@types/node": "*" } }, - "node_modules/eth-gas-reporter/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true }, - "node_modules/eth-gas-reporter/node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "node_modules/ethereumjs-abi/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/eth-gas-reporter/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/eth-gas-reporter/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" } }, - "node_modules/eth-gas-reporter/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">= 6" + "node": ">=10.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/ethereumjs-wallet": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", + "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", "dev": true, - "engines": { - "node": ">=4" + "dependencies": { + "aes-js": "^3.1.2", + "bs58check": "^2.1.2", + "ethereum-cryptography": "^0.1.3", + "ethereumjs-util": "^7.1.2", + "randombytes": "^2.1.0", + "scrypt-js": "^3.0.1", + "utf8": "^3.0.0", + "uuid": "^8.3.2" } }, - "node_modules/eth-gas-reporter/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "node_modules/ethereumjs-wallet/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/eth-gas-reporter/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/eth-gas-reporter/node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dev": true, "dependencies": { - "chalk": "^2.4.2" + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" }, "engines": { - "node": ">=8" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/eth-gas-reporter/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" }, "engines": { - "node": "*" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/eth-gas-reporter/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/eth-gas-reporter/node_modules/mocha": { + "node_modules/execa": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">= 8.10.0" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/eth-gas-reporter/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", "dev": true, "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eth-gas-reporter/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" }, "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, - "node_modules/eth-gas-reporter/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/eth-gas-reporter/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "node_modules/fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=4" + "node": ">=8.6.0" } }, - "node_modules/eth-gas-reporter/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "ansi-regex": "^3.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/eth-gas-reporter/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=6" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true - }, - "node_modules/eth-gas-reporter/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { - "isexe": "^2.0.0" + "to-regex-range": "^5.0.1" }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=8" } }, - "node_modules/eth-gas-reporter/node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "node_modules/find-package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz", + "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "array-back": "^3.0.1" }, "engines": { - "node": ">=6" + "node": ">=4.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" + "bin": { + "flat": "cli.js" } }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=12.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, - "node_modules/eth-gas-reporter/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/eth-gas-reporter/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" + "is-callable": "^1.1.3" } }, - "node_modules/eth-gas-reporter/node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/eth-gas-reporter/node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/eth-gas-reporter/node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dev": true, - "dependencies": { - "js-sha3": "^0.8.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/ethereum-cryptography": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.0.0.tgz", - "integrity": "sha512-g25m4EtfQGjstWgVE1aIz7XYYjf3kH5kG17ULWVB5dH6uLahsoltOhACzSxyDV+fhn4gbR4xRrOXGe6r2uh4Bg==", - "dev": true, - "dependencies": { - "@noble/curves": "1.0.0", - "@noble/hashes": "1.3.0", - "@scure/bip32": "1.3.0", - "@scure/bip39": "1.2.0" - } - }, - "node_modules/ethereum-waffle": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz", - "integrity": "sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==", - "dev": true, - "dependencies": { - "@ethereum-waffle/chai": "4.0.10", - "@ethereum-waffle/compiler": "4.0.3", - "@ethereum-waffle/mock-contract": "4.0.4", - "@ethereum-waffle/provider": "4.0.5", - "solc": "0.8.15", - "typechain": "^8.0.0" - }, - "bin": { - "waffle": "bin/waffle" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" - } - }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/ethereumjs-abi/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethereumjs-wallet": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", - "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", - "dev": true, - "dependencies": { - "aes-js": "^3.1.2", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^7.1.2", - "randombytes": "^2.1.0", - "scrypt-js": "^3.0.1", - "utf8": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "node_modules/ethereumjs-wallet/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, - "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-base64-decode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", - "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-package-json": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz", - "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==", - "dev": true - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz", - "integrity": "sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==", - "bundleDependencies": [ - "@trufflesuite/bigint-buffer", - "emittery", - "keccak", - "leveldown", - "secp256k1", - "@types/bn.js", - "@types/lru-cache", - "@types/seedrandom" - ], - "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "@trufflesuite/bigint-buffer": "1.1.10", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "5.1.1", - "@types/seedrandom": "3.0.1", - "emittery": "0.10.0", - "keccak": "3.0.2", - "leveldown": "6.1.0", - "secp256k1": "4.0.3" - }, - "bin": { - "ganache": "dist/node/cli.js", - "ganache-cli": "dist/node/cli.js" - }, - "optionalDependencies": { - "bufferutil": "4.0.5", - "utf-8-validate": "5.0.7" - } - }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", - "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "node-gyp-build": "4.4.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/ganache/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ganache/node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/@types/node": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", - "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/@types/seedrandom": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", - "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/ganache/node_modules/bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", - "dev": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/ganache/node_modules/catering": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", - "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "queue-tick": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "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" - } - }, - "node_modules/ganache/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/ganache/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/ganache/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/ganache/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache/node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache/node_modules/leveldown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", - "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "^7.2.0", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "catering": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/ganache/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/ganache/node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/queue-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", - "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ganache/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/ganache/node_modules/utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", - "dev": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/ganache/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - }, - "bin": { - "testrpc-sc": "index.js" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/hardhat": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.14.1.tgz", - "integrity": "sha512-H3Qp/UKyQGmPDDBSfMoSyH18rRnac90rsb0LNer+sKe6at6rxLe4D5j+M+1icqZQF02iLPjNRwc/PA8OPf757A==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@nomicfoundation/ethereumjs-vm": "7.0.1", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } - } + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true }, - "node_modules/hardhat-abi-exporter": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/hardhat-abi-exporter/-/hardhat-abi-exporter-2.10.1.tgz", - "integrity": "sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { - "@ethersproject/abi": "^5.5.0", - "delete-empty": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">=14.14.0" + "node": ">= 0.4" }, - "peerDependencies": { - "hardhat": "^2.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat-contract-sizer": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz", - "integrity": "sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "cli-table3": "^0.6.0", - "strip-ansi": "^6.0.0" - }, - "peerDependencies": { - "hardhat": "^2.0.0" - } + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true }, - "node_modules/hardhat-contract-sizer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat-contract-sizer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/ganache": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz", + "integrity": "sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==", + "bundleDependencies": [ + "@trufflesuite/bigint-buffer", + "emittery", + "keccak", + "leveldown", + "secp256k1", + "@types/bn.js", + "@types/lru-cache", + "@types/seedrandom" + ], "dev": true, + "hasShrinkwrap": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@trufflesuite/bigint-buffer": "1.1.10", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "5.1.1", + "@types/seedrandom": "3.0.1", + "emittery": "0.10.0", + "keccak": "3.0.2", + "leveldown": "6.1.0", + "secp256k1": "4.0.3" }, - "engines": { - "node": ">=10" + "bin": { + "ganache": "dist/node/cli.js", + "ganache-cli": "dist/node/cli.js" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "optionalDependencies": { + "bufferutil": "4.0.5", + "utf-8-validate": "5.0.7" } }, - "node_modules/hardhat-contract-sizer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", + "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "color-name": "~1.1.4" + "node-gyp-build": "4.4.0" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/hardhat-contract-sizer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/hardhat-contract-sizer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">= 14.0.0" } }, - "node_modules/hardhat-contract-sizer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "inBundle": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/hardhat-gas-reporter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "node_modules/ganache/node_modules/@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" - }, - "peerDependencies": { - "hardhat": "^2.0.2" + "@types/node": "*" } }, - "node_modules/hardhat-log-remover": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hardhat-log-remover/-/hardhat-log-remover-2.0.2.tgz", - "integrity": "sha512-TvEWOisQmZUZ7Mlb7s4XYS/MxgZzjFJSjDI8v3uTcrD6aaXy1QtomW6D6WNsISEWtwwRlSntOGpHQwFjrz2MCw==", + "node_modules/ganache/node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", "dev": true, - "peerDependencies": { - "hardhat": "^2.0.0" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/hardhat-spdx-license-identifier": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hardhat-spdx-license-identifier/-/hardhat-spdx-license-identifier-2.1.0.tgz", - "integrity": "sha512-Z3Avr/v6lfDfa7qkriF/h40X8wmuy8qZfS4HgbINkDdmCiKAxQUi5Y5TgsJBZFYN1MvYzLTIbD/fo1dxZ4gsng==", + "node_modules/ganache/node_modules/@types/node": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", "dev": true, - "peerDependencies": { - "hardhat": "^2.0.0" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/hardhat/node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "node_modules/ganache/node_modules/@types/seedrandom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", + "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", "dev": true, - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/hardhat/node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "node_modules/ganache/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } - ] + ], + "inBundle": true, + "license": "MIT" }, - "node_modules/hardhat/node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "node_modules/ganache/node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], + "inBundle": true, + "license": "MIT", "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/hardhat/node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "node_modules/ganache/node_modules/bufferutil": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", + "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "hasInstallScript": true, + "optional": true, "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" + "node-gyp-build": "^4.3.0" } }, - "node_modules/hardhat/node_modules/bn.js": { + "node_modules/ganache/node_modules/catering": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", + "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "queue-tick": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache/node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "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" + } + }, + "node_modules/ganache/node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "inBundle": true, + "license": "MIT" }, - "node_modules/hardhat/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true + "node_modules/ganache/node_modules/emittery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", + "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } }, - "node_modules/hardhat/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "node_modules/ganache/node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/hardhat/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "node_modules/ganache/node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/hardhat/node_modules/ethereumjs-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "node_modules/ganache/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, - "dependencies": { - "@types/node": "*" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" }, - "node_modules/hardhat/node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/ganache/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } + "inBundle": true, + "license": "ISC" }, - "node_modules/hardhat/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "node_modules/ganache/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/hardhat/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/hardhat/node_modules/keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "node_modules/ganache/node_modules/keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", "dev": true, "hasInstallScript": true, + "inBundle": true, + "license": "MIT", "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -9469,2024 +8177,2115 @@ "node": ">=10.0.0" } }, - "node_modules/hardhat/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/ganache/node_modules/leveldown": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", + "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "abstract-leveldown": "^7.2.0", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" }, "engines": { - "node": ">=4" + "node": ">=10.12.0" } }, - "node_modules/hardhat/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/ganache/node_modules/leveldown/node_modules/abstract-leveldown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", + "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "buffer": "^6.0.3", + "catering": "^2.0.0", + "is-buffer": "^2.0.5", + "level-concat-iterator": "^3.0.0", + "level-supports": "^2.0.1", + "queue-microtask": "^1.2.3" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/hardhat/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/ganache/node_modules/leveldown/node_modules/level-concat-iterator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", + "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "catering": "^2.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/hardhat/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/ganache/node_modules/leveldown/node_modules/level-supports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", + "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", "dev": true, + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/hardhat/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/ganache/node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true, - "engines": { - "node": ">=4" - } + "inBundle": true, + "license": "ISC" }, - "node_modules/hardhat/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/ganache/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/hardhat/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/ganache/node_modules/napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/hardhat/node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "node_modules/ganache/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", "dev": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, + "inBundle": true, + "license": "MIT", "bin": { - "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "node_modules/ganache/node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" }, - "node_modules/hardhat/node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/ganache/node_modules/queue-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", + "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", "dev": true, - "bin": { - "semver": "bin/semver" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/ganache/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 6" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/ganache/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/ganache/node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, "engines": { - "node": ">=4" + "node": ">=10.0.0" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/ganache/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "~5.2.0" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "node_modules/ganache/node_modules/utf-8-validate": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", + "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/ganache/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, - "bin": { - "he": "bin/he" + "engines": { + "node": "*" } }, - "node_modules/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - }, "engines": { - "node": ">=6.0.0" + "node": ">=8.0.0" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "@types/node": "^10.0.3" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-response-object/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "assert-plus": "^1.0.0" } }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "node_modules/ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", "dev": true, - "engines": { - "node": ">=14.18.0" + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" } }, - "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, - "bin": { - "husky": "lib/bin.js" + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=14" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/typicode" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, - "peer": true, "dependencies": { - "punycode": "2.1.0" + "global-prefix": "^3.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=6" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, "engines": { - "node": ">= 4" + "node": ">=6" } }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, "engines": { - "node": ">=0.8.19" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": ">= 0.4" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dev": true, "dependencies": { - "fp-ts": "^1.0.0" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/hardhat": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.0.tgz", + "integrity": "sha512-Com3SPFgk6v73LlE3rypuh32DYxOWvNbVBm5xfPUEzGVEW54Fcc4j3Uq7j6COj7S8Jc27uNihLFsveHYM0YJkQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-blockchain": "7.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-evm": "2.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-statemanager": "2.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "@nomicfoundation/ethereumjs-vm": "7.0.2", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "peer": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/hardhat-abi-exporter": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/hardhat-abi-exporter/-/hardhat-abi-exporter-2.10.1.tgz", + "integrity": "sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "@ethersproject/abi": "^5.5.0", + "delete-empty": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/hardhat-contract-sizer": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz", + "integrity": "sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" + "chalk": "^4.0.0", + "cli-table3": "^0.6.0", + "strip-ansi": "^6.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "hardhat": "^2.0.0" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/hardhat-contract-sizer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/hardhat-contract-sizer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/hardhat-contract-sizer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=7.0.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/hardhat-contract-sizer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/is-fullwidth-code-point": { + "node_modules/hardhat-contract-sizer/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/hardhat-contract-sizer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "node_modules/hardhat-gas-reporter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", "dev": true, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "dependencies": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" } }, - "node_modules/is-negative-zero": { + "node_modules/hardhat-log-remover": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "resolved": "https://registry.npmjs.org/hardhat-log-remover/-/hardhat-log-remover-2.0.2.tgz", + "integrity": "sha512-TvEWOisQmZUZ7Mlb7s4XYS/MxgZzjFJSjDI8v3uTcrD6aaXy1QtomW6D6WNsISEWtwwRlSntOGpHQwFjrz2MCw==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "hardhat": "^2.0.0" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/hardhat-spdx-license-identifier": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hardhat-spdx-license-identifier/-/hardhat-spdx-license-identifier-2.1.0.tgz", + "integrity": "sha512-Z3Avr/v6lfDfa7qkriF/h40X8wmuy8qZfS4HgbINkDdmCiKAxQUi5Y5TgsJBZFYN1MvYzLTIbD/fo1dxZ4gsng==", "dev": true, - "engines": { - "node": ">=0.12.0" + "peerDependencies": { + "hardhat": "^2.0.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/hardhat/node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "dev": true, - "engines": { - "node": ">=8" + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "dev": true, - "engines": { - "node": ">=8" + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/hardhat/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/hardhat/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/hardhat/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" } }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/hardhat/node_modules/ethereumjs-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@types/node": "*" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/hardhat/node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/hardhat/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/hardhat/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/hardhat/node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "dev": true, + "hasInstallScript": true, "dependencies": { - "has-symbols": "^1.0.2" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.0.0" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "node_modules/hardhat/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/hardhat/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "p-try": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true, - "peer": true - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/hardhat/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "p-limit": "^1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4" } }, - "node_modules/isarray": { + "node_modules/hardhat/node_modules/p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isomorphic-unfetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, - "dependencies": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" + "engines": { + "node": ">=4" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/hardhat/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "node_modules/hardhat/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "node_modules/hardhat/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" + "glob": "^7.1.3" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/hardhat/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/hardhat/node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" }, - "engines": { - "node": ">=10" + "bin": { + "solcjs": "solcjs" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/hardhat/node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=4" } }, - "node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "get-intrinsic": "^1.1.1" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "dev": true }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">= 0.8" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@types/node": "^10.0.3" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=7.0.0" + "node": ">= 6" } }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", "dev": true, + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "punycode": "2.1.0" }, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">= 4" } }, - "node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" } }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "peer": true, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "fp-ts": "^1.0.0" } }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "peer": true }, - "node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "has-bigints": "^1.0.1" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { + "node_modules/is-fullwidth-code-point": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", - "dev": true - }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "is-docker": "^3.0.0" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "dependencies": { - "bignumber.js": "^9.0.0" + "engines": { + "node": ">=0.12.0" } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=8" } }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, - "hasInstallScript": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "call-bind": "^1.0.2" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "engines": { - "node": ">=10.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/keccak256": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz", - "integrity": "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "bn.js": "^5.2.0", - "buffer": "^6.0.3", - "keccak": "^3.0.2" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/keccak256/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/keccak256/node_modules/keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, - "hasInstallScript": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "which-typed-array": "^1.1.11" }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } + "peer": true }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "peer": true, "dependencies": { - "invert-kv": "^1.0.0" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" + "is-docker": "^2.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" + "node": ">=8" } }, - "node_modules/level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "dependencies": { - "buffer": "^5.6.0" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level-codec/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", "dev": true, "dependencies": { - "errno": "~0.1.1" + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" }, "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/level-mem": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", - "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/level-transcoder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/level-ws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", - "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "node_modules/jest-haste-map": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^28.0.2", + "jest-util": "^28.1.3", + "jest-worker": "^28.1.3", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", "dev": true, "dependencies": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" }, "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/levelup/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "xtend": "^4.0.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" + "color-name": "~1.1.4" }, "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", "dev": true, "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/listr2/node_modules/ansi-styles": { + "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -11501,23 +10300,23 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/listr2/node_modules/color-convert": { + "node_modules/jest-message-util/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -11529,125 +10328,164 @@ "node": ">=7.0.0" } }, - "node_modules/listr2/node_modules/color-name": { + "node_modules/jest-message-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", "dev": true, - "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^28.1.3", + "@jest/transform": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-haste-map": "^28.1.3", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.3", + "semver": "^7.3.5" }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "peer": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { + "node_modules/jest-util/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -11662,7 +10500,7 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-symbols/node_modules/chalk": { + "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -11672,13 +10510,28 @@ "supports-color": "^7.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" } }, - "node_modules/log-symbols/node_modules/color-convert": { + "node_modules/jest-util/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -11690,13 +10543,13 @@ "node": ">=7.0.0" } }, - "node_modules/log-symbols/node_modules/color-name": { + "node_modules/jest-util/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/log-symbols/node_modules/has-flag": { + "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -11705,7 +10558,7 @@ "node": ">=8" } }, - "node_modules/log-symbols/node_modules/supports-color": { + "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -11717,202 +10570,320 @@ "node": ">=8" } }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "dev": true + }, + "node_modules/js-sdsl": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=7.0.0" + "node": ">=4" } }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "bin": { + "json5": "lib/cli.js" + }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/log-update/node_modules/slice-ansi": { + "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">=0.6.0" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/keccak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", "dev": true, + "hasInstallScript": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "node_modules/keccak256": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz", + "integrity": "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "bn.js": "^5.2.0", + "buffer": "^6.0.3", + "keccak": "^3.0.2" } }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true + "node_modules/keccak256/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/keccak256/node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { - "yallist": "^3.0.2" + "json-buffer": "3.0.1" } }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "dependencies": { - "tmpl": "1.0.5" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true - }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "dev": true, - "engines": { - "node": ">=8.9.0" + "optionalDependencies": { + "graceful-fs": "^4.1.9" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", "dev": true, + "peer": true, "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "dependencies": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" } }, - "node_modules/memdown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "node_modules/level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", "dev": true, "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "buffer": "^5.6.0" }, "engines": { "node": ">=6" } }, - "node_modules/memdown/node_modules/buffer": { + "node_modules/level-codec/node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", @@ -11936,260 +10907,331 @@ "ieee754": "^1.1.13" } }, - "node_modules/memdown/node_modules/immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "dev": true + "node_modules/level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/memdown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "node_modules/level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "dev": true, + "dependencies": { + "errno": "~0.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", "dev": true, "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", "xtend": "^4.0.2" }, "engines": { "node": ">=6" } }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "node_modules/level-mem": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", + "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", "dev": true, "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" + "level-packager": "^5.0.3", + "memdown": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "node_modules/level-packager": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", + "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", "dev": true, + "dependencies": { + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" + }, "engines": { - "node": ">= 0.10.0" + "node": ">=6" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "dev": true, + "engines": { + "node": ">=12" + } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/merkle-patricia-tree": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", - "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", + "node_modules/level-transcoder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "@types/levelup": "^4.3.0", - "ethereumjs-util": "^7.1.4", - "level-mem": "^5.0.1", - "level-ws": "^2.0.0", - "readable-stream": "^3.6.0", - "semaphore-async-await": "^1.5.1" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/micro-ftch": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "dev": true + "node_modules/level-ws": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", + "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "dev": true, + "dependencies": { + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/levelup/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "xtend": "^4.0.2" }, "engines": { - "node": ">=8.6" + "node": ">=6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/lint-staged": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", + "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", "dev": true, "dependencies": { - "mime-db": "1.52.0" + "chalk": "5.3.0", + "commander": "11.0.0", + "debug": "4.3.4", + "execa": "7.2.0", + "lilconfig": "2.1.0", + "listr2": "6.6.1", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": ">= 0.6" + "node": "^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/listr2": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "cli-truncate": "^3.1.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^5.0.1", + "rfdc": "^1.3.0", + "wrap-ansi": "^8.1.0" }, "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dev": true, + "peer": true, "dependencies": { - "minimist": "^1.2.6" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "dependencies": { - "obliterator": "^2.0.0" + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 14.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha-chai-jest-snapshot": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mocha-chai-jest-snapshot/-/mocha-chai-jest-snapshot-1.1.4.tgz", - "integrity": "sha512-ybwtS10P8BXDJQn9B3QyQA8Lxr/CcYxtuyWKk1PxD9vJorH8VL3edB7re4GcG9dRAdDPE/B0BsfwmCo6W43O7w==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true, + "peer": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "dependencies": { - "@jest/test-result": "^28.1.1", - "chalk": "^4.1.2", - "find-package-json": "^1.2.0", - "jest-snapshot": "^28.1.1", - "jest-util": "^28.1.1", - "slash": "^3.0.0", - "yargs": "^17.5.1" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, - "peerDependencies": { - "chai": "^4.3.6" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha-chai-jest-snapshot/node_modules/ansi-styles": { + "node_modules/log-symbols/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -12204,37 +11246,23 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/mocha-chai-jest-snapshot/node_modules/chalk": { + "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/mocha-chai-jest-snapshot/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/mocha-chai-jest-snapshot/node_modules/color-convert": { + "node_modules/log-symbols/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", @@ -12246,13 +11274,13 @@ "node": ">=7.0.0" } }, - "node_modules/mocha-chai-jest-snapshot/node_modules/color-name": { + "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/mocha-chai-jest-snapshot/node_modules/has-flag": { + "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", @@ -12261,7 +11289,7 @@ "node": ">=8" } }, - "node_modules/mocha-chai-jest-snapshot/node_modules/supports-color": { + "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", @@ -12273,55 +11301,71 @@ "node": ">=8" } }, - "node_modules/mocha-chai-jest-snapshot/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha-chai-jest-snapshot/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, + "dependencies": { + "type-fest": "^1.0.2" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/log-update/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "engines": { "node": ">=10" @@ -12330,1192 +11374,1337 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", + "dev": true + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true + }, + "node_modules/mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=8.9.0" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/memdown": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", + "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "dev": true, + "dependencies": { + "abstract-leveldown": "~6.2.1", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.2.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/memdown/node_modules/abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/memdown/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/memdown/node_modules/immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", "dev": true }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/memdown/node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "xtend": "^4.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=6" } }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "node_modules/memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", "dev": true, + "dependencies": { + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" + }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.10.0" } }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "node_modules/merkle-patricia-tree": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", + "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", + "dev": true, + "dependencies": { + "@types/levelup": "^4.3.0", + "ethereumjs-util": "^7.1.4", + "level-mem": "^5.0.1", + "level-ws": "^2.0.0", + "readable-stream": "^3.6.0", + "semaphore-async-await": "^1.5.1" + } }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", "dev": true }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "lodash": "^4.17.21" + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "node_modules/node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">= 0.6" } }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">= 0.6" } }, - "node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=12.19" + "node": "*" } }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "abbrev": "1" + "minimist": "^1.2.6" }, "bin": { - "nopt": "bin/nopt.js" + "mkdirp": "bin/cmd.js" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", "dev": true, - "peer": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "obliterator": "^2.0.0" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, - "peer": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "node_modules/mocha-chai-jest-snapshot": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mocha-chai-jest-snapshot/-/mocha-chai-jest-snapshot-1.1.4.tgz", + "integrity": "sha512-ybwtS10P8BXDJQn9B3QyQA8Lxr/CcYxtuyWKk1PxD9vJorH8VL3edB7re4GcG9dRAdDPE/B0BsfwmCo6W43O7w==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.1", + "chalk": "^4.1.2", + "find-package-json": "^1.2.0", + "jest-snapshot": "^28.1.1", + "jest-util": "^28.1.1", + "slash": "^3.0.0", + "yargs": "^17.5.1" + }, + "peerDependencies": { + "chai": "^4.3.6" + } + }, + "node_modules/mocha-chai-jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "path-key": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/mocha-chai-jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "node_modules/mocha-chai-jest-snapshot/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "node_modules/mocha-chai-jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=7.0.0" } }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "node_modules/mocha-chai-jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/mocha-chai-jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/mocha-chai-jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "node_modules/mocha-chai-jest-snapshot/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/mocha-chai-jest-snapshot/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "node_modules/mocha-chai-jest-snapshot/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", - "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", - "safe-array-concat": "^1.0.0" - }, + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, "dependencies": { - "wrappy": "1" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { - "mimic-fn": "^4.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, - "peer": true, - "dependencies": { - "lcid": "^1.0.0" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "lodash": "^4.17.21" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12.19" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, "dependencies": { - "callsites": "^3.0.0" + "abbrev": "1" }, - "engines": { - "node": ">=6" + "bin": { + "nopt": "bin/nopt.js" } }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "peer": true, "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "engines": { - "node": ">=8" + "peer": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-starts-with": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-starts-with/-/path-starts-with-2.0.0.tgz", - "integrity": "sha512-3UHTHbJz5+NLkPafFR+2ycJOjoc4WV2e9qCZCnm71zHiWaFrm1XniLVTkZXvaRgxr1xFh9JsTdicpH2yM03nLA==", + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-type": { + "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, + "peer": true, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", "dev": true, "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", "dev": true }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": "*" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, "engines": { - "node": ">=0.10" + "node": ">=0.10.0" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, - "peer": true, "dependencies": { - "pinkie": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "engines": { - "node": ">= 6" + "dependencies": { + "wrappy": "1" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { - "fast-diff": "^1.1.2" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.8.0" } }, - "node_modules/prettier-plugin-solidity": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", - "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", "dev": true, + "peer": true, "dependencies": { - "@solidity-parser/parser": "^0.16.0", - "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7" + "lcid": "^1.0.0" }, "engines": { - "node": ">=12" - }, - "peerDependencies": { - "prettier": ">=2.3.0 || >=3.0.0-alpha.0" + "node": ">=0.10.0" } }, - "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.0.tgz", - "integrity": "sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/prettier-plugin-solidity/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "p-limit": "^3.0.2" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier-plugin-solidity/node_modules/yallist": { + "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "aggregate-error": "^3.0.0" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "dependencies": { - "asap": "~2.0.6" + "engines": { + "node": ">=6" } }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/proper-lockfile/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, + "peer": true, + "dependencies": { + "error-ex": "^1.2.0" + }, "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/prr": { + "node_modules/path-browserify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true }, - "node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-starts-with": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-starts-with/-/path-starts-with-2.0.1.tgz", + "integrity": "sha512-wZ3AeiRBRlNwkdUxvBANh0+esnt38DLffHDujZyRHkqkaKHTglnY2EP5UX3b8rdeiSutgO4y9NEJwXezNP5vHg==", "dev": true, "engines": { - "node": ">=0.4.x" + "node": ">=8" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "engines": { + "node": ">=8" + } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "node": "*" } }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">= 0.8" + "node": ">=0.12" } }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "peer": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, - "peer": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "bin": { + "pidtree": "bin/pidtree.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "peer": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "peer": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "pinkie": "^2.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, "engines": { "node": ">= 6" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 0.8.0" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, - "dependencies": { - "resolve": "^1.1.6" + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">= 0.10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "dependencies": { - "minimatch": "^3.0.5" + "fast-diff": "^1.1.2" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "node_modules/prettier-plugin-solidity": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", + "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "@solidity-parser/parser": "^0.16.0", + "semver": "^7.3.8", + "solidity-comments-extractor": "^0.0.7" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "prettier": ">=2.3.0 || >=3.0.0-alpha.0" } }, - "node_modules/req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", + "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", "dev": true, "dependencies": { - "req-from": "^2.0.0" - }, - "engines": { - "node": ">=4" + "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", "dev": true, "dependencies": { - "resolve-from": "^3.0.0" + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=4" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/req-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" + "asap": "~2.0.6" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "dev": true, "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" } }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": ">= 4" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, "engines": { - "node": ">= 0.12" + "node": ">=6" } }, - "node_modules/request/node_modules/qs": { + "node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", @@ -13524,717 +12713,703 @@ "node": ">=0.6" } }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, - "bin": { - "uuid": "bin/uuid" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dev": true, "peer": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { + "node_modules/read-pkg-up": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true, - "peer": true - }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dev": true, + "peer": true, "dependencies": { - "path-parse": "^1.0.6" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "dev": true, + "peer": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { + "node_modules/read-pkg-up/node_modules/path-exists": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "dev": true, + "peer": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dev": true, + "peer": true, "dependencies": { - "mimic-fn": "^2.1.0" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "peer": true, "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "picomatch": "^2.2.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=8.10.0" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/rlp": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", - "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, "dependencies": { - "bn.js": "^4.11.1" + "minimatch": "^3.0.5" }, - "bin": { - "rlp": "bin/rlp" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/rlp/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "engines": { + "node": ">=6" } }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "dependencies": { - "queue-microtask": "^1.2.2" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", "dev": true, "dependencies": { - "tslib": "^2.1.0" + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==", - "dev": true - }, - "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "node_modules/req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" + "resolve-from": "^3.0.0" }, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/req-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "engines": { + "node": ">=4" + } }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sc-istanbul": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, - "bin": { - "istanbul": "lib/cli.js" + "engines": { + "node": ">= 0.12" } }, - "node_modules/sc-istanbul/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/sc-istanbul/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true - }, - "node_modules/sc-istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/sc-istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true, + "peer": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "path-parse": "^1.0.6" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { "node": ">=4" } }, - "node_modules/sc-istanbul/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true - }, - "node_modules/sc-istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { - "has-flag": "^1.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=0.8.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sc-istanbul/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=6" } }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "hasInstallScript": true, "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "dev": true + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } }, - "node_modules/semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "engines": { - "node": ">=4.1" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, "bin": { - "semver": "bin/semver.js" + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "dependencies": { - "randombytes": "^2.1.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "node_modules/rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", "dev": true, "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "bn.js": "^4.11.1" }, "bin": { - "sha.js": "bin.js" + "rlp": "bin/rlp" } }, - "node_modules/sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "node_modules/rlp/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", "dev": true, "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" + "execa": "^5.0.0" }, "engines": { - "node": "*" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10.17.0" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=12" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6" } }, - "node_modules/solc": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", - "integrity": "sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solc.js" - }, - "engines": { - "node": ">=10.0.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/solc/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", "dev": true, - "engines": { - "node": ">= 12" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", + "dev": true + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-ast": { - "version": "0.4.49", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.49.tgz", - "integrity": "sha512-Pr5sCAj1SFqzwFZw1HPKSq0PehlQNdM8GwKyAVYh2DOn7/cCK8LUKD1HeHnKtTgBW7hi9h4nnnan7hpAg5RhWQ==", + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, - "node_modules/solidity-comments-extractor": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", - "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", - "dev": true + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/solidity-coverage": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.3.tgz", - "integrity": "sha512-hbcNgj5z8zzgTlnp4F0pXiqj1v5ua8P4DH5i9cWOBtFPfUuIohLoXu5WiAixexWmpKVjyxXqupnu/mPb4IGr7Q==", + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.14.1", - "chalk": "^2.4.2", - "death": "^1.1.0", - "detect-port": "^1.3.0", - "difflib": "^0.2.4", - "fs-extra": "^8.1.0", - "ghost-testrpc": "^0.0.2", - "global-modules": "^2.0.0", - "globby": "^10.0.1", - "jsonschema": "^1.2.4", - "lodash": "^4.17.15", - "mocha": "7.1.2", - "node-emoji": "^1.10.0", - "pify": "^4.0.1", - "recursive-readdir": "^2.2.2", - "sc-istanbul": "^0.4.5", - "semver": "^7.3.4", - "shelljs": "^0.8.3", - "web3-utils": "^1.3.6" - }, - "bin": { - "solidity-coverage": "plugins/bin.js" + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" }, - "peerDependencies": { - "hardhat": "^2.11.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, - "node_modules/solidity-coverage/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" } }, - "node_modules/solidity-coverage/node_modules/argparse": { + "node_modules/sc-istanbul/node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", @@ -14243,73 +13418,51 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/solidity-coverage/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "node_modules/sc-istanbul/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" - } - }, - "node_modules/solidity-coverage/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/solidity-coverage/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "node": "*" } }, - "node_modules/solidity-coverage/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/solidity-coverage/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "engines": { - "node": ">=0.3.1" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/solidity-coverage/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/solidity-coverage/node_modules/esprima": { + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", @@ -14322,439 +13475,396 @@ "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "has-flag": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.8.0" } }, - "node_modules/solidity-coverage/node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { - "is-buffer": "~2.0.3" + "isexe": "^2.0.0" }, "bin": { - "flat": "cli.js" + "which": "bin/which" } }, - "node_modules/solidity-coverage/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", "dev": true, + "hasInstallScript": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=10.0.0" } }, - "node_modules/solidity-coverage/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true + }, + "node_modules/semaphore-async-await": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", + "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=4.1" } }, - "node_modules/solidity-coverage/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" + "randombytes": "^2.1.0" } }, - "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { + "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "peer": true }, - "node_modules/solidity-coverage/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/solidity-coverage/node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "dependencies": { - "chalk": "^2.4.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "sha.js": "bin.js" } }, - "node_modules/solidity-coverage/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" }, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/solidity-coverage/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "shebang-regex": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/mocha": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", - "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" }, "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "shjs": "bin/shjs" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/solidity-coverage/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, - "node_modules/solidity-coverage/node_modules/path-exists": { + "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "picomatch": "^2.0.4" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/solidity-coverage/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/solidity-coverage/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "node": ">=12" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/solc": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", + "integrity": "sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" }, "engines": { - "node": ">=6" + "node": ">=10.0.0" } }, - "node_modules/solidity-coverage/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/solc/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, - "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" + "bin": { + "semver": "bin/semver" } }, - "node_modules/solidity-coverage/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/solidity-ast": { + "version": "0.4.52", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.52.tgz", + "integrity": "sha512-iOya9BSiB9jhM8Vf40n8lGELGzwrUc57rl5BhfNtJ5cvAaMvRcNlHeAMNvqJJyjoUnczqRbHqdivEqK89du3Cw==", "dev": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "array.prototype.findlast": "^1.2.2" } }, - "node_modules/solidity-coverage/node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "node_modules/solidity-comments-extractor": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", + "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", "dev": true }, - "node_modules/solidity-coverage/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/solidity-coverage": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.5.tgz", + "integrity": "sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.16.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "mocha": "10.2.0", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" }, - "engines": { - "node": ">=6" + "bin": { + "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" } }, - "node_modules/solidity-coverage/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/solidity-coverage/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/solidity-coverage/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", + "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", "dev": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/solidity-coverage/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/solidity-coverage/node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "node_modules/solidity-coverage/node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/source-map": { @@ -14819,9 +13929,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true, "peer": true }, @@ -14913,24 +14023,6 @@ "node": ">= 0.8" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -14979,14 +14071,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -14996,28 +14088,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15085,6 +14177,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/superstruct": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.3.tgz", + "integrity": "sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -15120,6 +14221,28 @@ "get-port": "^3.1.0" } }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/synckit/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", @@ -15329,11 +14452,17 @@ "node": ">= 0.12" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/tmp": { "version": "0.0.33", @@ -15411,6 +14540,18 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-command-line-args": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", @@ -15569,21 +14710,6 @@ "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", "dev": true }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -15642,9 +14768,9 @@ } }, "node_modules/typechain": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.2.0.tgz", - "integrity": "sha512-tZqhqjxJ9xAS/Lh32jccTjMkpx7sTdUVVHAy5Bf0TIer5QFNYXotiX74oCvoVYjyxUKDK3MXHtMFzMyD3kE+jg==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.1.tgz", + "integrity": "sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==", "dev": true, "dependencies": { "@types/prettier": "^2.1.1", @@ -15697,6 +14823,72 @@ "node": ">=10" } }, + "node_modules/typechain/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -15718,9 +14910,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -15768,12 +14960,12 @@ } }, "node_modules/undici": { - "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "version": "5.25.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.25.4.tgz", + "integrity": "sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==", "dev": true, "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" @@ -15803,10 +14995,19 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -15843,21 +15044,36 @@ } }, "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "dev": true, "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, + "node_modules/url/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", @@ -15920,14 +15136,15 @@ } }, "node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.2.tgz", + "integrity": "sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==", "dev": true, "dependencies": { + "@ethereumjs/util": "^8.1.0", "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", + "ethereum-cryptography": "^2.1.2", "ethjs-unit": "0.1.6", "number-to-bn": "1.7.0", "randombytes": "^2.1.0", @@ -15992,17 +15209,16 @@ "peer": true }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -16011,58 +15227,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -16077,9 +15241,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -16120,54 +15284,83 @@ "dev": true }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, "node_modules/wrappy": { "version": "1.0.2", @@ -16209,15 +15402,6 @@ } } }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 098b0348..b7561798 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,8 @@ }, "homepage": "https://github.com/stakewise/v3-core#readme", "devDependencies": { - "@chainsafe/ssz": "0.11.1", - "@metamask/eth-sig-util": "5.1.0", + "@chainsafe/ssz": "0.13.0", + "@metamask/eth-sig-util": "7.0.0", "@nomiclabs/hardhat-ethers": "2.2.3", "@nomiclabs/hardhat-etherscan": "3.1.7", "@nomiclabs/hardhat-waffle": "2.0.6", @@ -42,20 +42,20 @@ "@openzeppelin/merkle-tree": "1.0.5", "@typechain/ethers-v5": "11.0.0", "@typechain/hardhat": "7.0.0", - "@types/mocha": "10.0.1", - "@types/node": "20.3.1", - "@typescript-eslint/eslint-plugin": "5.60.0", - "@typescript-eslint/parser": "5.60.0", - "bls-eth-wasm": "1.0.6", - "chai": "4.3.7", + "@types/mocha": "10.0.2", + "@types/node": "20.8.3", + "@typescript-eslint/eslint-plugin": "6.7.4", + "@typescript-eslint/parser": "6.7.4", + "bls-eth-wasm": "1.1.0", + "chai": "4.3.10", "dotenv": "16.3.1", - "eslint": "8.43.0", - "eslint-config-prettier": "8.8.0", - "eslint-plugin-prettier": "4.2.1", + "eslint": "8.51.0", + "eslint-config-prettier": "9.0.0", + "eslint-plugin-prettier": "5.0.0", "ethereum-waffle": "4.0.10", "ethereumjs-wallet": "1.0.2", "ethers": "5.7.2", - "hardhat": "2.14.1", + "hardhat": "2.18.0", "hardhat-abi-exporter": "2.10.1", "hardhat-contract-sizer": "2.10.0", "hardhat-gas-reporter": "1.0.9", @@ -63,14 +63,14 @@ "hardhat-spdx-license-identifier": "2.1.0", "husky": "8.0.3", "keccak256": "1.0.6", - "lint-staged": "13.2.2", + "lint-staged": "14.0.1", "mocha-chai-jest-snapshot": "1.1.4", - "prettier": "2.8.8", + "prettier": "3.0.3", "prettier-plugin-solidity": "1.1.3", - "solidity-coverage": "0.8.3", + "solidity-coverage": "0.8.5", "ts-node": "10.9.1", - "typechain": "8.2.0", - "typescript": "5.1.3" + "typechain": "8.3.1", + "typescript": "5.2.2" }, "lint-staged": { "test/**/*.ts": [ diff --git a/test/__snapshots__/CumulativeMerkleDrop.spec.ts.snap b/test/__snapshots__/CumulativeMerkleDrop.spec.ts.snap index d5e1497d..c8c65cca 100644 --- a/test/__snapshots__/CumulativeMerkleDrop.spec.ts.snap +++ b/test/__snapshots__/CumulativeMerkleDrop.spec.ts.snap @@ -3,13 +3,13 @@ exports[`CumulativeMerkleDrop claim works with valid proof 1`] = ` Object { "calldataByteLength": 228, - "gasUsed": 83962, + "gasUsed": 83971, } `; exports[`CumulativeMerkleDrop set merkle root works for owner 1`] = ` Object { "calldataByteLength": 164, - "gasUsed": 49768, + "gasUsed": 49770, } `; diff --git a/test/__snapshots__/EthErc20Vault.spec.ts.snap b/test/__snapshots__/EthErc20Vault.spec.ts.snap index 6c74dc11..16d6c224 100644 --- a/test/__snapshots__/EthErc20Vault.spec.ts.snap +++ b/test/__snapshots__/EthErc20Vault.spec.ts.snap @@ -3,34 +3,34 @@ exports[`EthErc20Vault deposit emits transfer event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 68941, + "gasUsed": 68948, } `; exports[`EthErc20Vault deposit through receive fallback function emits transfer event 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 76166, + "gasUsed": 76174, } `; exports[`EthErc20Vault enter exit queue emits transfer event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 89113, + "gasUsed": 89124, } `; exports[`EthErc20Vault redeem emits transfer event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 60231, + "gasUsed": 60245, } `; exports[`EthErc20Vault update exit queue emits transfer event 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 137465, + "gasUsed": 137482, } `; diff --git a/test/__snapshots__/EthGenesisVault.spec.ts.snap b/test/__snapshots__/EthGenesisVault.spec.ts.snap index 8a953aa0..725662ee 100644 --- a/test/__snapshots__/EthGenesisVault.spec.ts.snap +++ b/test/__snapshots__/EthGenesisVault.spec.ts.snap @@ -3,55 +3,55 @@ exports[`EthGenesisVault can deposit through receive fallback function 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 74449, + "gasUsed": 74456, } `; exports[`EthGenesisVault migrate migrates from rewardEthToken 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 74438, + "gasUsed": 74448, } `; exports[`EthGenesisVault pulls assets on claim exited assets 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 62491, + "gasUsed": 62504, } `; exports[`EthGenesisVault pulls assets on multiple validators registration 1`] = ` Object { "calldataByteLength": 3716, - "gasUsed": 667191, + "gasUsed": 667408, } `; exports[`EthGenesisVault pulls assets on single validator registration 1`] = ` Object { "calldataByteLength": 1444, - "gasUsed": 335593, + "gasUsed": 335694, } `; exports[`EthGenesisVault update state deducts rewards on first state update 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 145142, + "gasUsed": 145172, } `; exports[`EthGenesisVault update state splits penalty between rewardEthToken and vault 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 100547, + "gasUsed": 100572, } `; exports[`EthGenesisVault update state splits reward between rewardEthToken and vault 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 162242, + "gasUsed": 162272, } `; diff --git a/test/__snapshots__/EthPrivErc20Vault.spec.ts.snap b/test/__snapshots__/EthPrivErc20Vault.spec.ts.snap index fdaeff76..ec094f99 100644 --- a/test/__snapshots__/EthPrivErc20Vault.spec.ts.snap +++ b/test/__snapshots__/EthPrivErc20Vault.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthPrivErc20Vault deposit can be called by whitelisted user 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 71152, + "gasUsed": 71162, } `; exports[`EthPrivErc20Vault deposit deposit through receive fallback can be called by whitelisted sender 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 78338, + "gasUsed": 78348, } `; diff --git a/test/__snapshots__/EthVault.burn.spec.ts.snap b/test/__snapshots__/EthVault.burn.spec.ts.snap index ba6c1a9b..1d1d4e5c 100644 --- a/test/__snapshots__/EthVault.burn.spec.ts.snap +++ b/test/__snapshots__/EthVault.burn.spec.ts.snap @@ -3,6 +3,6 @@ exports[`EthVault - burn updates position accumulated fee 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 97126, + "gasUsed": 97149, } `; diff --git a/test/__snapshots__/EthVault.deposit.spec.ts.snap b/test/__snapshots__/EthVault.deposit.spec.ts.snap index 494c71c1..be041874 100644 --- a/test/__snapshots__/EthVault.deposit.spec.ts.snap +++ b/test/__snapshots__/EthVault.deposit.spec.ts.snap @@ -3,27 +3,27 @@ exports[`EthVault - deposit empty vault: no assets & no shares deposit 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 66772, + "gasUsed": 66779, } `; exports[`EthVault - deposit full vault: assets & shares deposit 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 66772, + "gasUsed": 66779, } `; exports[`EthVault - deposit full vault: assets & shares deposit through receive fallback function 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 74338, + "gasUsed": 74346, } `; exports[`EthVault - deposit full vault: assets & shares update state and deposit 1`] = ` Object { "calldataByteLength": 260, - "gasUsed": 207528, + "gasUsed": 207559, } `; diff --git a/test/__snapshots__/EthVault.liquidate.spec.ts.snap b/test/__snapshots__/EthVault.liquidate.spec.ts.snap index fe715bfb..5330ff87 100644 --- a/test/__snapshots__/EthVault.liquidate.spec.ts.snap +++ b/test/__snapshots__/EthVault.liquidate.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - liquidate calculates liquidation correctly 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 109079, + "gasUsed": 109123, } `; exports[`EthVault - liquidate can liquidate 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 111734, + "gasUsed": 111779, } `; diff --git a/test/__snapshots__/EthVault.mint.spec.ts.snap b/test/__snapshots__/EthVault.mint.spec.ts.snap index 8373340a..5fd41a51 100644 --- a/test/__snapshots__/EthVault.mint.spec.ts.snap +++ b/test/__snapshots__/EthVault.mint.spec.ts.snap @@ -3,20 +3,20 @@ exports[`EthVault - mint mints osTokens to the receiver 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 151768, + "gasUsed": 151803, } `; exports[`EthVault - mint updates position accumulated fee 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 151768, + "gasUsed": 151803, } `; exports[`EthVault - mint updates position accumulated fee 2`] = ` Object { "calldataByteLength": 100, - "gasUsed": 129805, + "gasUsed": 129848, } `; diff --git a/test/__snapshots__/EthVault.multicall.spec.ts.snap b/test/__snapshots__/EthVault.multicall.spec.ts.snap index 184b77c8..cc976bca 100644 --- a/test/__snapshots__/EthVault.multicall.spec.ts.snap +++ b/test/__snapshots__/EthVault.multicall.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - multicall can update state and queue for exit 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 164156, + "gasUsed": 164202, } `; exports[`EthVault - multicall can update state and queue for exit 2`] = ` Object { "calldataByteLength": 548, - "gasUsed": 137770, + "gasUsed": 137813, } `; diff --git a/test/__snapshots__/EthVault.redeem.spec.ts.snap b/test/__snapshots__/EthVault.redeem.spec.ts.snap index 8e0618e0..58b69533 100644 --- a/test/__snapshots__/EthVault.redeem.spec.ts.snap +++ b/test/__snapshots__/EthVault.redeem.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - redeem osToken calculates redeem correctly 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 120611, + "gasUsed": 120660, } `; exports[`EthVault - redeem osToken can redeem 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 123266, + "gasUsed": 123316, } `; diff --git a/test/__snapshots__/EthVault.register.spec.ts.snap b/test/__snapshots__/EthVault.register.spec.ts.snap index d73fe5c0..2dcf827a 100644 --- a/test/__snapshots__/EthVault.register.spec.ts.snap +++ b/test/__snapshots__/EthVault.register.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - register multiple validators succeeds 1`] = ` Object { "calldataByteLength": 3652, - "gasUsed": 707781, + "gasUsed": 708000, } `; exports[`EthVault - register single validator succeeds 1`] = ` Object { "calldataByteLength": 1444, - "gasUsed": 357022, + "gasUsed": 357127, } `; diff --git a/test/__snapshots__/EthVault.settings.spec.ts.snap b/test/__snapshots__/EthVault.settings.spec.ts.snap index 8136c5be..1edc22f1 100644 --- a/test/__snapshots__/EthVault.settings.spec.ts.snap +++ b/test/__snapshots__/EthVault.settings.spec.ts.snap @@ -3,27 +3,27 @@ exports[`EthVault - settings fee recipient can update 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 44064, + "gasUsed": 44069, } `; exports[`EthVault - settings keys manager can be updated by admin 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 53051, + "gasUsed": 53054, } `; exports[`EthVault - settings metadata IPFS hash only admin can update 1`] = ` Object { "calldataByteLength": 132, - "gasUsed": 32696, + "gasUsed": 32699, } `; exports[`EthVault - settings validators root can update 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 54956, + "gasUsed": 54960, } `; diff --git a/test/__snapshots__/EthVault.state.spec.ts.snap b/test/__snapshots__/EthVault.state.spec.ts.snap index f0b33482..255dc010 100644 --- a/test/__snapshots__/EthVault.state.spec.ts.snap +++ b/test/__snapshots__/EthVault.state.spec.ts.snap @@ -3,20 +3,20 @@ exports[`EthVault - state allocates fee to recipient when delta is above zero 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 117715, + "gasUsed": 117736, } `; exports[`EthVault - state applies penalty when delta is below zero 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 115301, + "gasUsed": 115319, } `; exports[`EthVault - state updates exit queue 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 144793, + "gasUsed": 144818, } `; diff --git a/test/__snapshots__/EthVault.token.spec.ts.snap b/test/__snapshots__/EthVault.token.spec.ts.snap index bc66aa6c..76bb9479 100644 --- a/test/__snapshots__/EthVault.token.spec.ts.snap +++ b/test/__snapshots__/EthVault.token.spec.ts.snap @@ -3,90 +3,90 @@ exports[`EthVault - token approve decrease allowance when the spender is not the zero address when the sender does not have enough balance when the spender had an approved amount decreases the spender allowance subtracting the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 34817, + "gasUsed": 34824, } `; exports[`EthVault - token approve decrease allowance when the spender is not the zero address when the sender does not have enough balance when the spender had an approved amount emits an approval event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 30017, + "gasUsed": 30024, } `; exports[`EthVault - token approve decrease allowance when the spender is not the zero address when the sender has enough balance when the spender had an approved amount decreases the spender allowance subtracting the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 34817, + "gasUsed": 34824, } `; exports[`EthVault - token approve decrease allowance when the spender is not the zero address when the sender has enough balance when the spender had an approved amount emits an approval event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 30017, + "gasUsed": 30024, } `; exports[`EthVault - token approve increase allowance when the spender is not the zero address when the sender does not have enough balance when the spender had an approved amount increases the spender allowance adding the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 34245, + "gasUsed": 34252, } `; exports[`EthVault - token approve increase allowance when the spender is not the zero address when the sender does not have enough balance when there was no approved amount before approves the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 51345, + "gasUsed": 51352, } `; exports[`EthVault - token approve when the sender has enough balance when the spender had an approved amount approves the requested amount and replaces the previous one 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 33775, + "gasUsed": 33781, } `; exports[`EthVault - token approve when the sender has enough balance when there was no approved amount before approves the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 50875, + "gasUsed": 50881, } `; exports[`EthVault - token permit accepts owner signature 1`] = ` Object { "calldataByteLength": 228, - "gasUsed": 82502, + "gasUsed": 82511, } `; exports[`EthVault - token transfer from when the spender has enough allowance when the token owner has enough balance transfers the requested amount 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 54828, + "gasUsed": 54838, } `; exports[`EthVault - token transfer from when the spender has unlimited allowance does not decrease the spender allowance 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 61304, + "gasUsed": 61313, } `; exports[`EthVault - token transfer when the sender transfers all balance transfers the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 54579, + "gasUsed": 54587, } `; exports[`EthVault - token transfer when the sender transfers zero tokens transfers the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 36655, + "gasUsed": 36663, } `; diff --git a/test/__snapshots__/EthVault.upgrade.spec.ts.snap b/test/__snapshots__/EthVault.upgrade.spec.ts.snap index b987904f..3b44a6dc 100644 --- a/test/__snapshots__/EthVault.upgrade.spec.ts.snap +++ b/test/__snapshots__/EthVault.upgrade.spec.ts.snap @@ -3,6 +3,6 @@ exports[`EthVault - upgrade works with valid call data 1`] = ` Object { "calldataByteLength": 132, - "gasUsed": 78435, + "gasUsed": 78465, } `; diff --git a/test/__snapshots__/EthVault.whitelist.spec.ts.snap b/test/__snapshots__/EthVault.whitelist.spec.ts.snap index 0108f067..fbcc941d 100644 --- a/test/__snapshots__/EthVault.whitelist.spec.ts.snap +++ b/test/__snapshots__/EthVault.whitelist.spec.ts.snap @@ -3,34 +3,34 @@ exports[`EthVault - whitelist deposit can be called by whitelisted user 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 68983, + "gasUsed": 68993, } `; exports[`EthVault - whitelist deposit deposit through receive fallback can be called by whitelisted sender 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 76510, + "gasUsed": 76520, } `; exports[`EthVault - whitelist set whitelister admin can update whitelister 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 36250, + "gasUsed": 36253, } `; exports[`EthVault - whitelist whitelist can be updated by whitelister 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 53124, + "gasUsed": 53127, } `; exports[`EthVault - whitelist whitelist can be updated by whitelister 2`] = ` Object { "calldataByteLength": 68, - "gasUsed": 31212, + "gasUsed": 31215, } `; diff --git a/test/__snapshots__/EthVault.withdraw.spec.ts.snap b/test/__snapshots__/EthVault.withdraw.spec.ts.snap index ad097a40..30a3c25c 100644 --- a/test/__snapshots__/EthVault.withdraw.spec.ts.snap +++ b/test/__snapshots__/EthVault.withdraw.spec.ts.snap @@ -3,57 +3,57 @@ exports[`EthVault - withdraw claim exited assets for single user in multiple checkpoints in multiple transactions 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 75040, + "gasUsed": 75054, } `; exports[`EthVault - withdraw claim exited assets for single user in multiple checkpoints in multiple transactions 2`] = ` Object { "calldataByteLength": 100, - "gasUsed": 48057, + "gasUsed": 48067, } `; exports[`EthVault - withdraw claim exited assets for single user in multiple checkpoints in single transaction 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 50479, + "gasUsed": 50494, } `; exports[`EthVault - withdraw claim exited assets for single user in single checkpoint 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 48057, + "gasUsed": 48067, } `; exports[`EthVault - withdraw enter exit queue locks shares for the time of exit 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 87114, + "gasUsed": 87124, } `; -exports[`EthVault - withdraw get checkpoint index works with many checkpoints 1`] = `29935`; +exports[`EthVault - withdraw get checkpoint index works with many checkpoints 1`] = `29948`; exports[`EthVault - withdraw redeem redeem transfers assets to receiver 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 58241, + "gasUsed": 58254, } `; exports[`EthVault - withdraw update exit queue adds checkpoint 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 103402, + "gasUsed": 103416, } `; exports[`EthVault - withdraw update exit queue for not all the queued shares 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 103398, + "gasUsed": 103412, } `; diff --git a/test/__snapshots__/EthVaultFactory.spec.ts.snap b/test/__snapshots__/EthVaultFactory.spec.ts.snap index 8d109d78..790e289a 100644 --- a/test/__snapshots__/EthVaultFactory.spec.ts.snap +++ b/test/__snapshots__/EthVaultFactory.spec.ts.snap @@ -3,55 +3,55 @@ exports[`EthVaultFactory EthErc20Vault private vault deployment with own escrow gas 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 618842, + "gasUsed": 620898, } `; exports[`EthVaultFactory EthErc20Vault private vault deployment with shared escrow gas 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 467815, + "gasUsed": 468265, } `; exports[`EthVaultFactory EthErc20Vault public vault deployment with own escrow gas 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 570678, + "gasUsed": 572729, } `; exports[`EthVaultFactory EthErc20Vault public vault deployment with shared escrow gas 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 419651, + "gasUsed": 420096, } `; exports[`EthVaultFactory EthVault private vault deployment with own escrow gas 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 544937, + "gasUsed": 546984, } `; exports[`EthVaultFactory EthVault private vault deployment with shared escrow gas 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 393910, + "gasUsed": 394351, } `; exports[`EthVaultFactory EthVault public vault deployment with own escrow gas 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 496770, + "gasUsed": 498812, } `; exports[`EthVaultFactory EthVault public vault deployment with shared escrow gas 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 345743, + "gasUsed": 346179, } `; diff --git a/test/__snapshots__/KeeperOracles.spec.ts.snap b/test/__snapshots__/KeeperOracles.spec.ts.snap index 423ff7d6..0d6c99b1 100644 --- a/test/__snapshots__/KeeperOracles.spec.ts.snap +++ b/test/__snapshots__/KeeperOracles.spec.ts.snap @@ -3,20 +3,20 @@ exports[`KeeperOracles add oracle succeeds 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 52926, + "gasUsed": 52928, } `; exports[`KeeperOracles remove oracle succeeds 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 31108, + "gasUsed": 31111, } `; exports[`KeeperOracles update config succeeds 1`] = ` Object { "calldataByteLength": 132, - "gasUsed": 27006, + "gasUsed": 27009, } `; diff --git a/test/__snapshots__/KeeperRewards.spec.ts.snap b/test/__snapshots__/KeeperRewards.spec.ts.snap index 74e7d017..d2624688 100644 --- a/test/__snapshots__/KeeperRewards.spec.ts.snap +++ b/test/__snapshots__/KeeperRewards.spec.ts.snap @@ -3,69 +3,69 @@ exports[`KeeperRewards harvest (own escrow) succeeds for latest rewards root 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 111559, + "gasUsed": 111585, } `; exports[`KeeperRewards harvest (own escrow) succeeds for previous rewards root 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 113713, + "gasUsed": 113740, } `; exports[`KeeperRewards harvest (own escrow) succeeds for previous rewards root 2`] = ` Object { "calldataByteLength": 196, - "gasUsed": 74397, + "gasUsed": 74415, } `; exports[`KeeperRewards harvest (shared escrow) succeeds for latest rewards root 1`] = ` Object { "calldataByteLength": 292, - "gasUsed": 144172, + "gasUsed": 144199, } `; exports[`KeeperRewards harvest (shared escrow) succeeds for previous rewards root 1`] = ` Object { "calldataByteLength": 292, - "gasUsed": 146326, + "gasUsed": 146354, } `; exports[`KeeperRewards harvest (shared escrow) succeeds for previous rewards root 2`] = ` Object { "calldataByteLength": 196, - "gasUsed": 90631, + "gasUsed": 90652, } `; exports[`KeeperRewards set min rewards oracles succeeds 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 32254, + "gasUsed": 32256, } `; exports[`KeeperRewards update rewards succeeds 1`] = ` Object { "calldataByteLength": 772, - "gasUsed": 140857, + "gasUsed": 140899, } `; exports[`KeeperRewards update rewards succeeds 2`] = ` Object { "calldataByteLength": 772, - "gasUsed": 123769, + "gasUsed": 123811, } `; exports[`KeeperRewards update rewards succeeds with all signatures 1`] = ` Object { "calldataByteLength": 1156, - "gasUsed": 147061, + "gasUsed": 147103, } `; diff --git a/test/__snapshots__/KeeperValidators.spec.ts.snap b/test/__snapshots__/KeeperValidators.spec.ts.snap index bb92d05c..f5d875c8 100644 --- a/test/__snapshots__/KeeperValidators.spec.ts.snap +++ b/test/__snapshots__/KeeperValidators.spec.ts.snap @@ -3,34 +3,34 @@ exports[`KeeperValidators register multiple validators succeeds 1`] = ` Object { "calldataByteLength": 3716, - "gasUsed": 708792, + "gasUsed": 709015, } `; exports[`KeeperValidators register multiple validators succeeds 2`] = ` Object { "calldataByteLength": 3716, - "gasUsed": 617234, + "gasUsed": 617456, } `; exports[`KeeperValidators register single validator succeeds 1`] = ` Object { "calldataByteLength": 1508, - "gasUsed": 358086, + "gasUsed": 358189, } `; exports[`KeeperValidators register single validator succeeds 2`] = ` Object { "calldataByteLength": 1508, - "gasUsed": 304559, + "gasUsed": 304661, } `; exports[`KeeperValidators set validators rewards oracles succeeds 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 32166, + "gasUsed": 32168, } `; diff --git a/test/__snapshots__/OsToken.spec.ts.snap b/test/__snapshots__/OsToken.spec.ts.snap index d6220b9f..139e714a 100644 --- a/test/__snapshots__/OsToken.spec.ts.snap +++ b/test/__snapshots__/OsToken.spec.ts.snap @@ -3,125 +3,125 @@ exports[`OsToken approve decrease allowance when the spender is not the zero address when the sender does not have enough balance when the spender had an approved amount decreases the spender allowance subtracting the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 29574, + "gasUsed": 29579, } `; exports[`OsToken approve decrease allowance when the spender is not the zero address when the sender does not have enough balance when the spender had an approved amount emits an approval event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 24774, + "gasUsed": 24779, } `; exports[`OsToken approve decrease allowance when the spender is not the zero address when the sender has enough balance when the spender had an approved amount decreases the spender allowance subtracting the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 29574, + "gasUsed": 29579, } `; exports[`OsToken approve decrease allowance when the spender is not the zero address when the sender has enough balance when the spender had an approved amount emits an approval event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 24774, + "gasUsed": 24779, } `; exports[`OsToken approve increase allowance when the spender is not the zero address when the sender does not have enough balance when the spender had an approved amount increases the spender allowance adding the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 29244, + "gasUsed": 29249, } `; exports[`OsToken approve increase allowance when the spender is not the zero address when the sender does not have enough balance when there was no approved amount before approves the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 46344, + "gasUsed": 46349, } `; exports[`OsToken approve when the sender has enough balance when the spender had an approved amount approves the requested amount and replaces the previous one 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 28909, + "gasUsed": 28914, } `; exports[`OsToken approve when the sender has enough balance when there was no approved amount before approves the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 46009, + "gasUsed": 46014, } `; exports[`OsToken capacity owner can change 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 25257, + "gasUsed": 25258, } `; exports[`OsToken checker owner can change 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 30609, + "gasUsed": 30610, } `; exports[`OsToken fee percent owner can change 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 69110, + "gasUsed": 69118, } `; exports[`OsToken keeper owner can change 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 30279, + "gasUsed": 30280, } `; exports[`OsToken permit accepts owner signature 1`] = ` Object { "calldataByteLength": 228, - "gasUsed": 74719, + "gasUsed": 74721, } `; exports[`OsToken transfer from when the spender has enough allowance when the token owner has enough balance transfers the requested amount 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 47482, + "gasUsed": 47488, } `; exports[`OsToken transfer from when the spender has unlimited allowance does not decrease the spender allowance 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 53960, + "gasUsed": 53966, } `; exports[`OsToken transfer when the sender transfers all balance transfers the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 46873, + "gasUsed": 46879, } `; exports[`OsToken transfer when the sender transfers zero tokens transfers the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 28949, + "gasUsed": 28955, } `; exports[`OsToken treasury owner can change 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 28022, + "gasUsed": 28023, } `; diff --git a/test/__snapshots__/OsTokenConfig.spec.ts.snap b/test/__snapshots__/OsTokenConfig.spec.ts.snap index 51b90aec..0762b7f8 100644 --- a/test/__snapshots__/OsTokenConfig.spec.ts.snap +++ b/test/__snapshots__/OsTokenConfig.spec.ts.snap @@ -3,6 +3,6 @@ exports[`OsTokenConfig owner can update config 1`] = ` Object { "calldataByteLength": 164, - "gasUsed": 32426, + "gasUsed": 32429, } `; diff --git a/test/__snapshots__/OwnMevEscrow.spec.ts.snap b/test/__snapshots__/OwnMevEscrow.spec.ts.snap index e2c7f987..f4aa6a95 100644 --- a/test/__snapshots__/OwnMevEscrow.spec.ts.snap +++ b/test/__snapshots__/OwnMevEscrow.spec.ts.snap @@ -2,7 +2,7 @@ exports[`OwnMevEscrow vault deployment gas 1`] = ` Object { - "calldataByteLength": 649, - "gasUsed": 158469, + "calldataByteLength": 660, + "gasUsed": 160119, } `; diff --git a/test/__snapshots__/RewardSplitter.spec.ts.snap b/test/__snapshots__/RewardSplitter.spec.ts.snap index fe2e4436..33a91294 100644 --- a/test/__snapshots__/RewardSplitter.spec.ts.snap +++ b/test/__snapshots__/RewardSplitter.spec.ts.snap @@ -3,34 +3,34 @@ exports[`RewardSplitter decrease shares owner can decrease shares 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 67145, + "gasUsed": 67163, } `; exports[`RewardSplitter increase shares owner can increase shares 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 78756, + "gasUsed": 78763, } `; exports[`RewardSplitter sync rewards anyone can sync rewards 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 73181, + "gasUsed": 73195, } `; exports[`RewardSplitter withdraw rewards can claim vault tokens for ERC-20 vault 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 78421, + "gasUsed": 78437, } `; exports[`RewardSplitter withdraw rewards can enter exit queue with multicall 1`] = ` Object { "calldataByteLength": 612, - "gasUsed": 168760, + "gasUsed": 168827, } `; diff --git a/test/__snapshots__/RewardSplitterFactory.spec.ts.snap b/test/__snapshots__/RewardSplitterFactory.spec.ts.snap index 9254b2c9..018a8c69 100644 --- a/test/__snapshots__/RewardSplitterFactory.spec.ts.snap +++ b/test/__snapshots__/RewardSplitterFactory.spec.ts.snap @@ -3,6 +3,6 @@ exports[`RewardSplitterFactory splitter deployment gas 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 137542, + "gasUsed": 137552, } `; diff --git a/test/__snapshots__/SharedMevEscrow.spec.ts.snap b/test/__snapshots__/SharedMevEscrow.spec.ts.snap index 7cd85c9d..86096dc4 100644 --- a/test/__snapshots__/SharedMevEscrow.spec.ts.snap +++ b/test/__snapshots__/SharedMevEscrow.spec.ts.snap @@ -2,7 +2,7 @@ exports[`SharedMevEscrow vault deployment gas 1`] = ` Object { - "calldataByteLength": 695, - "gasUsed": 170061, + "calldataByteLength": 700, + "gasUsed": 170481, } `; diff --git a/test/__snapshots__/VaultsRegistry.spec.ts.snap b/test/__snapshots__/VaultsRegistry.spec.ts.snap index 3146a1bd..87f41c53 100644 --- a/test/__snapshots__/VaultsRegistry.spec.ts.snap +++ b/test/__snapshots__/VaultsRegistry.spec.ts.snap @@ -3,34 +3,34 @@ exports[`VaultsRegistry owner can add factory 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 47326, + "gasUsed": 47328, } `; exports[`VaultsRegistry owner can add vault 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 49685, + "gasUsed": 49686, } `; exports[`VaultsRegistry owner can register implementation contract 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 47497, + "gasUsed": 47499, } `; exports[`VaultsRegistry owner can remove factory 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 25489, + "gasUsed": 25491, } `; exports[`VaultsRegistry owner can remove implementation 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 25440, + "gasUsed": 25442, } `; From 560b91b0b253c76506b61d021d9a439bef73b65f Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Tue, 10 Oct 2023 01:48:39 +0300 Subject: [PATCH 10/12] Migrate to ethers v6 --- .prettierrc | 1 + hardhat.config.ts | 7 +- helpers/constants.ts | 15 +- package-lock.json | 4358 +++++------------ package.json | 16 +- tasks/eth-full-deploy-local.ts | 75 +- tasks/eth-full-deploy.ts | 172 +- test/CumulativeMerkleDrop.spec.ts | 50 +- test/EthErc20Vault.spec.ts | 110 +- test/EthGenesisVault.spec.ts | 272 +- test/EthPrivErc20Vault.spec.ts | 70 +- test/EthVault.burn.spec.ts | 59 +- test/EthVault.deposit.spec.ts | 105 +- test/EthVault.liquidate.spec.ts | 85 +- test/EthVault.mint.spec.ts | 84 +- test/EthVault.multicall.spec.ts | 111 +- test/EthVault.redeem.spec.ts | 89 +- test/EthVault.register.spec.ts | 106 +- test/EthVault.settings.spec.ts | 63 +- test/EthVault.state.spec.ts | 191 +- test/EthVault.token.spec.ts | 114 +- test/EthVault.upgrade.spec.ts | 124 +- test/EthVault.whitelist.spec.ts | 82 +- test/EthVault.withdraw.spec.ts | 616 +-- test/EthVaultFactory.spec.ts | 41 +- test/KeeperOracles.spec.ts | 45 +- test/KeeperRewards.spec.ts | 366 +- test/KeeperValidators.spec.ts | 162 +- test/OsToken.spec.ts | 115 +- test/OsTokenConfig.spec.ts | 50 +- test/OwnMevEscrow.spec.ts | 26 +- test/PriceOracle.test.ts | 29 +- test/RewardSplitter.spec.ts | 211 +- test/RewardSplitterFactory.spec.ts | 49 +- test/SharedMevEscrow.spec.ts | 31 +- test/VaultsRegistry.spec.ts | 114 +- .../EthGenesisVault.spec.ts.snap | 4 +- test/__snapshots__/EthVault.burn.spec.ts.snap | 7 + test/__snapshots__/EthVault.mint.spec.ts.snap | 6 +- .../EthVault.multicall.spec.ts.snap | 4 +- .../EthVault.register.spec.ts.snap | 4 +- .../__snapshots__/EthVault.state.spec.ts.snap | 2 +- .../__snapshots__/EthVault.token.spec.ts.snap | 2 +- .../EthVault.withdraw.spec.ts.snap | 4 +- test/__snapshots__/KeeperRewards.spec.ts.snap | 20 +- .../KeeperValidators.spec.ts.snap | 12 +- .../__snapshots__/VaultsRegistry.spec.ts.snap | 13 +- test/shared/constants.ts | 21 +- test/shared/expect.ts | 2 - test/shared/fixtures.ts | 204 +- test/shared/rewards.ts | 73 +- test/shared/snapshotGasCost.ts | 14 +- test/shared/types.ts | 10 +- test/shared/utils.ts | 73 +- test/shared/validators.ts | 49 +- tsconfig.json | 2 +- 56 files changed, 3473 insertions(+), 5267 deletions(-) diff --git a/.prettierrc b/.prettierrc index 6ca8b801..f8b6e02a 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,6 +4,7 @@ "semi": false, "singleQuote": true, "tabWidth": 2, + "plugins": ["prettier-plugin-solidity"], "overrides": [ { "files": "*.sol", diff --git a/hardhat.config.ts b/hardhat.config.ts index b9a220be..e2fec915 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -2,12 +2,7 @@ import { HardhatUserConfig } from 'hardhat/types' import dotenv from 'dotenv' import glob from 'glob' import path from 'path' -import '@nomiclabs/hardhat-ethers' -import '@nomiclabs/hardhat-etherscan' -import '@nomiclabs/hardhat-waffle' -import '@typechain/hardhat' -import 'solidity-coverage' -import 'hardhat-gas-reporter' +import '@nomicfoundation/hardhat-toolbox' import 'hardhat-contract-sizer' import 'hardhat-log-remover' import 'hardhat-spdx-license-identifier' diff --git a/helpers/constants.ts b/helpers/constants.ts index 700bb435..252ee228 100644 --- a/helpers/constants.ts +++ b/helpers/constants.ts @@ -1,6 +1,5 @@ import { NetworkConfig, Networks } from './types' -import { BigNumber } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { ethers } from 'ethers' export const NETWORKS: { [network in Networks]: NetworkConfig @@ -30,13 +29,13 @@ export const NETWORKS: { rewardsMinOracles: 6, validatorsMinOracles: 9, rewardsDelay: 12 * 60 * 60, - maxAvgRewardPerSecond: BigNumber.from('6341958397'), // 20% APY + maxAvgRewardPerSecond: 6341958397n, // 20% APY oraclesConfigIpfsHash: 'QmYcJE3hWnrJrLeL56d1gwGZFA3G61cwq7Sc8znWQSFVii', // OsToken treasury: '0xFF2B6d2d5c205b99E2e6f607B6aFA3127B9957B6', osTokenFeePercent: 500, - osTokenCapacity: parseEther('1000000'), + osTokenCapacity: ethers.parseEther('1000000'), osTokenName: 'SW Staked ETH', osTokenSymbol: 'osETH', redeemFromLtvPercent: 9150, // 91.5% @@ -50,7 +49,7 @@ export const NETWORKS: { admin: '0xFF2B6d2d5c205b99E2e6f607B6aFA3127B9957B6', poolEscrow: '0x040F15C6b5Bfc5F324eCaB5864C38D4e1EEF4218', rewardEthToken: '0x826f88d423440c305D9096cC1581Ae751eFCAfB0', - capacity: parseEther('1000000'), + capacity: ethers.parseEther('1000000'), feePercent: 500, }, priceFeedDescription: 'osETH/ETH', @@ -72,13 +71,13 @@ export const NETWORKS: { rewardsDelay: 12 * 60 * 60, rewardsMinOracles: 6, validatorsMinOracles: 9, - maxAvgRewardPerSecond: BigNumber.from('6341958397'), // 20% APY + maxAvgRewardPerSecond: 6341958397n, // 20% APY oraclesConfigIpfsHash: '', // OsToken treasury: '0x144a98cb1CdBb23610501fE6108858D9B7D24934', osTokenFeePercent: 500, - osTokenCapacity: parseEther('1000000'), + osTokenCapacity: ethers.parseEther('1000000'), osTokenName: 'Staked ETH', osTokenSymbol: 'osETH', @@ -94,7 +93,7 @@ export const NETWORKS: { admin: '', poolEscrow: '0x2296e122c1a20Fca3CAc3371357BdAd3be0dF079', rewardEthToken: '0x20BC832ca081b91433ff6c17f85701B6e92486c5', - capacity: parseEther('1000000'), + capacity: ethers.parseEther('1000000'), feePercent: 500, }, priceFeedDescription: 'osETH/ETH', diff --git a/package-lock.json b/package-lock.json index 23e0738f..09eab958 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,30 +15,20 @@ "devDependencies": { "@chainsafe/ssz": "0.13.0", "@metamask/eth-sig-util": "7.0.0", - "@nomiclabs/hardhat-ethers": "2.2.3", - "@nomiclabs/hardhat-etherscan": "3.1.7", - "@nomiclabs/hardhat-waffle": "2.0.6", - "@openzeppelin/hardhat-upgrades": "1.28.0", + "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@openzeppelin/hardhat-upgrades": "2.3.1", "@openzeppelin/merkle-tree": "1.0.5", - "@typechain/ethers-v5": "11.0.0", - "@typechain/hardhat": "7.0.0", - "@types/mocha": "10.0.2", "@types/node": "20.8.3", "@typescript-eslint/eslint-plugin": "6.7.4", "@typescript-eslint/parser": "6.7.4", "bls-eth-wasm": "1.1.0", - "chai": "4.3.10", "dotenv": "16.3.1", "eslint": "8.51.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-prettier": "5.0.0", - "ethereum-waffle": "4.0.10", "ethereumjs-wallet": "1.0.2", - "ethers": "5.7.2", - "hardhat": "2.18.0", "hardhat-abi-exporter": "2.10.1", "hardhat-contract-sizer": "2.10.0", - "hardhat-gas-reporter": "1.0.9", "hardhat-log-remover": "2.0.2", "hardhat-spdx-license-identifier": "2.1.0", "husky": "8.0.3", @@ -47,9 +37,7 @@ "mocha-chai-jest-snapshot": "1.1.4", "prettier": "3.0.3", "prettier-plugin-solidity": "1.1.3", - "solidity-coverage": "0.8.5", "ts-node": "10.9.1", - "typechain": "8.3.1", "typescript": "5.2.2" } }, @@ -62,6 +50,13 @@ "node": ">=0.10.0" } }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", + "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==", + "dev": true, + "peer": true + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -675,238 +670,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@ensdomains/ens": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "deprecated": "Please use @ensdomains/ens-contracts", - "dev": true, - "peer": true, - "dependencies": { - "bluebird": "^3.5.2", - "eth-ens-namehash": "^2.0.8", - "solc": "^0.4.20", - "testrpc": "0.0.1", - "web3-utils": "^1.0.0-beta.31" - } - }, - "node_modules/@ensdomains/ens/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/@ensdomains/ens/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true, - "peer": true - }, - "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "peer": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@ensdomains/ens/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/@ensdomains/ens/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@ensdomains/ens/node_modules/solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", - "dev": true, - "peer": true, - "dependencies": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "bin": { - "solcjs": "solcjs" - } - }, - "node_modules/@ensdomains/ens/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "peer": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true, - "peer": true - }, - "node_modules/@ensdomains/ens/node_modules/yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", - "dev": true, - "peer": true, - "dependencies": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "node_modules/@ensdomains/ens/node_modules/yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - }, - "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "deprecated": "Please use @ensdomains/ens-contracts", - "dev": true, - "peer": true - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -963,165 +726,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@ethereum-waffle/chai": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz", - "integrity": "sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==", - "dev": true, - "dependencies": { - "@ethereum-waffle/provider": "4.0.5", - "debug": "^4.3.4", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" - } - }, - "node_modules/@ethereum-waffle/compiler": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz", - "integrity": "sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==", - "dev": true, - "dependencies": { - "@resolver-engine/imports": "^0.3.3", - "@resolver-engine/imports-fs": "^0.3.3", - "@typechain/ethers-v5": "^10.0.0", - "@types/mkdirp": "^0.5.2", - "@types/node-fetch": "^2.6.1", - "mkdirp": "^0.5.1", - "node-fetch": "^2.6.7" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*", - "solc": "*", - "typechain": "^8.0.0" - } - }, - "node_modules/@ethereum-waffle/compiler/node_modules/@typechain/ethers-v5": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", - "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.1", - "typescript": ">=4.3.0" - } - }, - "node_modules/@ethereum-waffle/ens": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz", - "integrity": "sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "@ensdomains/ens": "^0.4.4", - "@ensdomains/resolver": "^0.2.4", - "ethers": "*" - } - }, - "node_modules/@ethereum-waffle/mock-contract": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz", - "integrity": "sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==", - "dev": true, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" - } - }, - "node_modules/@ethereum-waffle/provider": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-4.0.5.tgz", - "integrity": "sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==", - "dev": true, - "dependencies": { - "@ethereum-waffle/ens": "4.0.3", - "@ganache/ethereum-options": "0.1.4", - "debug": "^4.3.4", - "ganache": "7.4.3" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" - } - }, - "node_modules/@ethereumjs/block": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", - "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" - } - }, - "node_modules/@ethereumjs/block/node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/block/node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/blockchain": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", - "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/ethash": "^1.1.0", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "level-mem": "^5.0.1", - "lru-cache": "^5.1.1", - "semaphore-async-await": "^1.5.1" - } - }, - "node_modules/@ethereumjs/blockchain/node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, "node_modules/@ethereumjs/common": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz", @@ -1132,19 +736,6 @@ "crc-32": "^1.2.0" } }, - "node_modules/@ethereumjs/ethash": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", - "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.5.0", - "@types/levelup": "^4.3.0", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.1.1", - "miller-rabin": "^4.0.0" - } - }, "node_modules/@ethereumjs/rlp": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", @@ -1186,61 +777,6 @@ "node": ">=14" } }, - "node_modules/@ethereumjs/vm": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.6.0.tgz", - "integrity": "sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==", - "dev": true, - "dependencies": { - "@ethereumjs/block": "^3.6.0", - "@ethereumjs/blockchain": "^5.5.0", - "@ethereumjs/common": "^2.6.0", - "@ethereumjs/tx": "^3.4.0", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^2.2.0", - "ethereumjs-util": "^7.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.2", - "rustbn.js": "~0.2.0" - } - }, - "node_modules/@ethereumjs/vm/node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/vm/node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/vm/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@ethereumjs/vm/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", @@ -1691,10 +1227,31 @@ "ws": "7.4.6" } }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "dev": true, "funding": [ { @@ -1957,141 +1514,6 @@ "node": ">=14" } }, - "node_modules/@ganache/ethereum-address": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz", - "integrity": "sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==", - "dev": true, - "dependencies": { - "@ganache/utils": "0.1.4" - } - }, - "node_modules/@ganache/ethereum-options": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz", - "integrity": "sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==", - "dev": true, - "dependencies": { - "@ganache/ethereum-address": "0.1.4", - "@ganache/ethereum-utils": "0.1.4", - "@ganache/options": "0.1.4", - "@ganache/utils": "0.1.4", - "bip39": "3.0.4", - "seedrandom": "3.0.5" - } - }, - "node_modules/@ganache/ethereum-utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz", - "integrity": "sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "2.6.0", - "@ethereumjs/tx": "3.4.0", - "@ethereumjs/vm": "5.6.0", - "@ganache/ethereum-address": "0.1.4", - "@ganache/rlp": "0.1.4", - "@ganache/utils": "0.1.4", - "emittery": "0.10.0", - "ethereumjs-abi": "0.6.8", - "ethereumjs-util": "7.1.3" - } - }, - "node_modules/@ganache/ethereum-utils/node_modules/@ethereumjs/common": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz", - "integrity": "sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==", - "dev": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.3" - } - }, - "node_modules/@ganache/ethereum-utils/node_modules/@ethereumjs/tx": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz", - "integrity": "sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==", - "dev": true, - "dependencies": { - "@ethereumjs/common": "^2.6.0", - "ethereumjs-util": "^7.1.3" - } - }, - "node_modules/@ganache/ethereum-utils/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@ganache/ethereum-utils/node_modules/ethereumjs-util": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz", - "integrity": "sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@ganache/options": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/options/-/options-0.1.4.tgz", - "integrity": "sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==", - "dev": true, - "dependencies": { - "@ganache/utils": "0.1.4", - "bip39": "3.0.4", - "seedrandom": "3.0.5" - } - }, - "node_modules/@ganache/rlp": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/rlp/-/rlp-0.1.4.tgz", - "integrity": "sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==", - "dev": true, - "dependencies": { - "@ganache/utils": "0.1.4", - "rlp": "2.2.6" - } - }, - "node_modules/@ganache/utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==", - "dev": true, - "dependencies": { - "emittery": "0.10.0", - "keccak": "3.0.1", - "seedrandom": "3.0.5" - }, - "optionalDependencies": { - "@trufflesuite/bigint-buffer": "1.1.9" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", @@ -2745,6 +2167,7 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", "dev": true, + "peer": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "4.0.2", "@nomicfoundation/ethereumjs-rlp": "5.0.2", @@ -2764,6 +2187,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2782,11 +2206,61 @@ "setimmediate": "^1.0.5" } }, + "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, "node_modules/@nomicfoundation/ethereumjs-blockchain": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", "dev": true, + "peer": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "5.0.2", "@nomicfoundation/ethereumjs-common": "4.0.2", @@ -2812,6 +2286,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2835,6 +2310,7 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", "dev": true, + "peer": true, "dependencies": { "@nomicfoundation/ethereumjs-util": "9.0.2", "crc-32": "^1.2.0" @@ -2845,6 +2321,7 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", "dev": true, + "peer": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "5.0.2", "@nomicfoundation/ethereumjs-rlp": "5.0.2", @@ -2863,6 +2340,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2886,6 +2364,7 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", "dev": true, + "peer": true, "dependencies": { "@ethersproject/providers": "^5.7.1", "@nomicfoundation/ethereumjs-common": "4.0.2", @@ -2906,6 +2385,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2929,6 +2409,7 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", "dev": true, + "peer": true, "bin": { "rlp": "bin/rlp" }, @@ -2941,6 +2422,7 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", "dev": true, + "peer": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "4.0.2", "@nomicfoundation/ethereumjs-rlp": "5.0.2", @@ -2956,6 +2438,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2974,11 +2457,61 @@ "setimmediate": "^1.0.5" } }, + "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, "node_modules/@nomicfoundation/ethereumjs-trie": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", "dev": true, + "peer": true, "dependencies": { "@nomicfoundation/ethereumjs-rlp": "5.0.2", "@nomicfoundation/ethereumjs-util": "9.0.2", @@ -2996,6 +2529,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3019,6 +2553,7 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", "dev": true, + "peer": true, "dependencies": { "@chainsafe/ssz": "^0.9.2", "@ethersproject/providers": "^5.7.2", @@ -3035,13 +2570,15 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/@chainsafe/persistent-merkle-tree": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", "dev": true, + "peer": true, "dependencies": { "@chainsafe/as-sha256": "^0.3.1" } @@ -3051,6 +2588,7 @@ "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", "dev": true, + "peer": true, "dependencies": { "@chainsafe/as-sha256": "^0.3.1", "@chainsafe/persistent-merkle-tree": "^0.4.2", @@ -3063,6 +2601,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3086,6 +2625,7 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", "dev": true, + "peer": true, "dependencies": { "@chainsafe/ssz": "^0.10.0", "@nomicfoundation/ethereumjs-rlp": "5.0.2", @@ -3099,13 +2639,15 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", "dev": true, + "peer": true, "dependencies": { "@chainsafe/as-sha256": "^0.3.1" } @@ -3115,6 +2657,7 @@ "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", "dev": true, + "peer": true, "dependencies": { "@chainsafe/as-sha256": "^0.3.1", "@chainsafe/persistent-merkle-tree": "^0.5.0" @@ -3126,6 +2669,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3149,6 +2693,7 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", "dev": true, + "peer": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "5.0.2", "@nomicfoundation/ethereumjs-blockchain": "7.0.2", @@ -3174,6 +2719,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3192,40 +2738,145 @@ "setimmediate": "^1.0.5" } }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", + "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==", "dev": true, - "engines": { - "node": ">= 12" + "peer": true, + "dependencies": { + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "chai": "^4.2.0", + "ethers": "^6.1.0", + "hardhat": "^2.9.4" } }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", + "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "ethers": "^6.1.0", + "hardhat": "^2.0.0" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz", + "integrity": "sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==", + "dev": true, + "peer": true, + "dependencies": { + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.9.5" + } + }, + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", + "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", + "dev": true, + "peerDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-verify": "^1.0.0", + "@typechain/ethers-v6": "^0.4.0", + "@typechain/hardhat": "^8.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=12.0.0", + "chai": "^4.2.0", + "ethers": "^6.4.0", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.2.0", + "typescript": ">=4.5.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz", + "integrity": "sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { "node": ">= 10" } }, @@ -3241,6 +2892,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 10" } @@ -3257,6 +2909,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">= 10" } @@ -3273,6 +2926,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -3289,6 +2943,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -3305,6 +2960,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -3321,6 +2977,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">= 10" } @@ -3337,6 +2994,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10" } @@ -3353,6 +3011,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10" } @@ -3369,63 +3028,11 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">= 10" } }, - "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", - "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", - "dev": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", - "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - }, - "peerDependencies": { - "hardhat": "^2.0.4" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@nomiclabs/hardhat-waffle": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz", - "integrity": "sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg==", - "dev": true, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@types/sinon-chai": "^3.2.3", - "ethereum-waffle": "*", - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, "node_modules/@openzeppelin/contracts": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz", @@ -3436,6 +3043,67 @@ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.2.tgz", "integrity": "sha512-siviV3PZV/fHfPaoIC51rf1Jb6iElkYWnNYZ0leO23/ukXuvOyoC/ahy8jqiV7g+++9Nuo3n/rk5ajSN/+d/Sg==" }, + "node_modules/@openzeppelin/defender-admin-client": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-admin-client/-/defender-admin-client-1.48.0.tgz", + "integrity": "sha512-MN29JD6jA3PgOxF2tG0aZbMIwOCieYWkK9UbHCq1UzGPrMgGV9NVMUyVdqpv7Ynplwsjp5ZTBDOyttwvTlchHg==", + "dev": true, + "dependencies": { + "@openzeppelin/defender-base-client": "1.48.0", + "axios": "^1.4.0", + "ethers": "^5.7.2", + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" + } + }, + "node_modules/@openzeppelin/defender-admin-client/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, "node_modules/@openzeppelin/defender-base-client": { "version": "1.48.0", "resolved": "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.48.0.tgz", @@ -3450,29 +3118,32 @@ } }, "node_modules/@openzeppelin/hardhat-upgrades": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.28.0.tgz", - "integrity": "sha512-7sb/Jf+X+uIufOBnmHR0FJVWuxEs2lpxjJnLNN6eCJCP8nD0v+Ot5lTOW2Qb/GFnh+fLvJtEkhkowz4ZQ57+zQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.3.1.tgz", + "integrity": "sha512-4QkhWIzvW/JaDp3ZupWnoJsUhkh0aXNSndsbqPPgsgEWDu7TME1XrXSb/3cNDCoyt/7KpcEl1XOwhyOYgp0bxg==", "dev": true, "dependencies": { - "@openzeppelin/defender-base-client": "^1.46.0", - "@openzeppelin/platform-deploy-client": "^0.8.0", - "@openzeppelin/upgrades-core": "^1.27.0", + "@openzeppelin/defender-admin-client": "^1.48.0", + "@openzeppelin/defender-base-client": "^1.48.0", + "@openzeppelin/platform-deploy-client": "^0.10.0", + "@openzeppelin/upgrades-core": "^1.30.0", "chalk": "^4.1.0", "debug": "^4.1.1", - "proper-lockfile": "^4.1.1" + "ethereumjs-util": "^7.1.5", + "proper-lockfile": "^4.1.1", + "undici": "^5.14.0" }, "bin": { "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js" }, "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "ethers": "^5.0.5", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-verify": "^1.1.0", + "ethers": "^6.6.0", "hardhat": "^2.0.2" }, "peerDependenciesMeta": { - "@nomiclabs/harhdat-etherscan": { + "@nomicfoundation/hardhat-verify": { "optional": true } } @@ -3615,28 +3286,19 @@ } }, "node_modules/@openzeppelin/platform-deploy-client": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.8.0.tgz", - "integrity": "sha512-POx3AsnKwKSV/ZLOU/gheksj0Lq7Is1q2F3pKmcFjGZiibf+4kjGxr4eSMrT+2qgKYZQH1ZLQZ+SkbguD8fTvA==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.10.0.tgz", + "integrity": "sha512-jayQPeXqw4LnWIrNhNqgikJSre+n2NRrnEu76niSdVXc/faQkG3PmaHtRPJMFgsYxjjAiAfcMYyV95YBDuLexA==", "deprecated": "@openzeppelin/platform-deploy-client is deprecated. Please use @openzeppelin/defender-sdk-deploy-client", "dev": true, "dependencies": { "@ethersproject/abi": "^5.6.3", - "@openzeppelin/defender-base-client": "^1.46.0", - "axios": "^0.21.2", + "@openzeppelin/defender-base-client": "^1.48.0-rc.1", + "axios": "^1.4.0", "lodash": "^4.17.19", "node-fetch": "^2.6.0" } }, - "node_modules/@openzeppelin/platform-deploy-client/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/@openzeppelin/upgrades-core": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.30.0.tgz", @@ -3764,87 +3426,6 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, - "node_modules/@resolver-engine/core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", - "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "is-url": "^1.2.4", - "request": "^2.85.0" - } - }, - "node_modules/@resolver-engine/core/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@resolver-engine/fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", - "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", - "dev": true, - "dependencies": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0" - } - }, - "node_modules/@resolver-engine/fs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@resolver-engine/imports": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", - "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", - "dev": true, - "dependencies": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0", - "hosted-git-info": "^2.6.0", - "path-browserify": "^1.0.0", - "url": "^0.11.0" - } - }, - "node_modules/@resolver-engine/imports-fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", - "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", - "dev": true, - "dependencies": { - "@resolver-engine/fs": "^0.3.3", - "@resolver-engine/imports": "^0.3.3", - "debug": "^3.1.0" - } - }, - "node_modules/@resolver-engine/imports-fs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@resolver-engine/imports/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/@scure/base": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", @@ -3886,6 +3467,7 @@ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", "dev": true, + "peer": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -3902,6 +3484,7 @@ "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", "dev": true, + "peer": true, "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -3916,6 +3499,7 @@ "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", "dev": true, + "peer": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -3930,6 +3514,7 @@ "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", "dev": true, + "peer": true, "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -3950,6 +3535,7 @@ "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", "dev": true, + "peer": true, "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -3966,6 +3552,7 @@ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -3975,6 +3562,7 @@ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", "dev": true, + "peer": true, "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -4012,23 +3600,11 @@ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, + "peer": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz", - "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "4.3.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -4053,82 +3629,38 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, - "node_modules/@typechain/ethers-v5": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-11.0.0.tgz", - "integrity": "sha512-JDAvOjtzGuEQukgArIEseHznS2+v+vG3TpfODjNj4tu1kgmVu66G9gk7THOO04HJ5q+OJSLx9b46lc3GRGPIVA==", + "node_modules/@typechain/ethers-v6": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", + "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", "dev": true, + "peer": true, "dependencies": { "lodash": "^4.17.15", "ts-essentials": "^7.0.1" }, "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.2.0", - "typescript": ">=4.3.0" + "ethers": "6.x", + "typechain": "^8.3.1", + "typescript": ">=4.7.0" } }, "node_modules/@typechain/hardhat": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-7.0.0.tgz", - "integrity": "sha512-XB79i5ewg9Met7gMVGfgVkmypicbnI25T5clJBEooMoW2161p4zvKFpoS2O+lBppQyMrPIZkdvl2M3LMDayVcA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", + "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", "dev": true, + "peer": true, "dependencies": { "fs-extra": "^9.1.0" }, "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@typechain/ethers-v5": "^11.0.0", - "ethers": "^5.4.7", + "@typechain/ethers-v6": "^0.4.3", + "ethers": "^6.1.0", "hardhat": "^2.9.9", - "typechain": "^8.2.0" + "typechain": "^8.3.1" } }, - "node_modules/@typechain/hardhat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typechain/hardhat/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@typechain/hardhat/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@types/abstract-leveldown": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.3.tgz", - "integrity": "sha512-YAdL8tIYbiKoFjAf/0Ir3mvRJ/iFvBP/FK0I8Xa5rGWgVcq0xWOEInzlJfs6TIPWFweEOTKgNSBdxneUcHRvaw==", - "dev": true - }, "node_modules/@types/babel__traverse": { "version": "7.20.2", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", @@ -4154,11 +3686,22 @@ "dev": true, "peer": true }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz", + "integrity": "sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/concat-stream": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -4177,6 +3720,7 @@ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -4186,6 +3730,7 @@ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "peer": true, "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -4230,49 +3775,26 @@ "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, - "node_modules/@types/level-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", - "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==", - "dev": true - }, - "node_modules/@types/levelup": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", - "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", - "dev": true, - "dependencies": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" - } - }, "node_modules/@types/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", "dev": true, - "dependencies": { - "@types/node": "*" - } + "peer": true }, "node_modules/@types/mocha": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.2.tgz", "integrity": "sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/ms": { "version": "0.7.32", @@ -4286,16 +3808,6 @@ "integrity": "sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==", "dev": true }, - "node_modules/@types/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, "node_modules/@types/pbkdf2": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", @@ -4315,13 +3827,15 @@ "version": "6.9.8", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/readable-stream": { "version": "2.3.15", "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" @@ -4331,7 +3845,8 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/secp256k1": { "version": "4.0.4", @@ -4348,34 +3863,6 @@ "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, - "node_modules/@types/sinon": { - "version": "10.0.19", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.19.tgz", - "integrity": "sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinon-chai": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.10.tgz", - "integrity": "sha512-D+VFqUjMqeku/FGl4Ioo+fDeWOaIfbZ6Oj+glgFUgz5m5RJ4kgCER3FdV1uvhmEt0A+FRz+juPdybFlg5Hxfow==", - "dev": true, - "peer": true, - "dependencies": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz", - "integrity": "sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==", - "dev": true, - "peer": true - }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -4590,13 +4077,15 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/abstract-level": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", "dev": true, + "peer": true, "dependencies": { "buffer": "^6.0.3", "catering": "^2.1.0", @@ -4629,63 +4118,12 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, - "node_modules/abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/abstract-leveldown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/abstract-leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -4721,6 +4159,7 @@ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -4730,6 +4169,7 @@ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true, + "peer": true, "engines": { "node": ">=0.3.0" } @@ -4745,6 +4185,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, + "peer": true, "dependencies": { "debug": "4" }, @@ -4757,6 +4198,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "peer": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -4800,6 +4242,7 @@ "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, "optional": true, + "peer": true, "engines": { "node": ">=0.4.2" } @@ -4818,6 +4261,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, + "peer": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -4833,6 +4277,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -4897,6 +4342,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -4928,6 +4374,7 @@ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -4976,31 +4423,15 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, - "engines": { - "node": ">=0.8" - } + "peer": true }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "peer": true, "engines": { "node": "*" } @@ -5010,27 +4441,17 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } }, "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", "dev": true, - "dependencies": { - "async": "^2.4.0" - } + "peer": true }, "node_modules/async-retry": { "version": "1.3.3", @@ -5052,6 +4473,7 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "peer": true, "engines": { "node": ">= 4.0.0" } @@ -5068,21 +4490,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, "node_modules/axios": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", @@ -5168,21 +4575,6 @@ } ] }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", @@ -5203,46 +4595,21 @@ "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", "dev": true, + "peer": true, "engines": { "node": ">=14.0.0" } }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } }, - "node_modules/bip39": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", - "dev": true, - "dependencies": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" - } - }, - "node_modules/bip39/node_modules/@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", - "dev": true - }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -5255,13 +4622,6 @@ "integrity": "sha512-5kNu85tXD0dHEDABo05tYgCcRToBDwjn+3cAWBiJivzh2EUotdfRmgIxNrsZWnqtQjoMK56hqNmM69cxFH/Wog==", "dev": true }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "peer": true - }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -5313,6 +4673,7 @@ "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", "dev": true, + "peer": true, "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.1", @@ -5324,7 +4685,8 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/browserify-aes": { "version": "1.2.0", @@ -5340,12 +4702,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/browserify-aes/node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, "node_modules/browserslist": { "version": "4.22.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", @@ -5422,16 +4778,14 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/buffer-xor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", - "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.1" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true }, "node_modules/bundle-name": { "version": "3.0.0", @@ -5453,6 +4807,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "peer": true, "engines": { "node": ">= 0.8" } @@ -5513,6 +4868,7 @@ "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", "dev": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -5521,13 +4877,15 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/catering": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -5537,6 +4895,7 @@ "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, + "peer": true, "dependencies": { "nofilter": "^3.1.0" }, @@ -5549,6 +4908,7 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, + "peer": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -5562,6 +4922,19 @@ "node": ">=4" } }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "peer": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5581,6 +4954,7 @@ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, + "peer": true, "engines": { "node": "*" } @@ -5590,6 +4964,7 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "peer": true, "dependencies": { "get-func-name": "^2.0.2" }, @@ -5608,6 +4983,7 @@ "url": "https://paulmillr.com/funding/" } ], + "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5629,6 +5005,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5640,7 +5017,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/cipher-base": { "version": "1.0.4", @@ -5658,6 +5036,7 @@ "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", "dev": true, "hasInstallScript": true, + "peer": true, "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.0", @@ -5674,6 +5053,7 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -5779,6 +5159,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -5790,6 +5171,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5805,6 +5187,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5816,13 +5199,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5835,16 +5220,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -5877,6 +5252,7 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, + "peer": true, "engines": { "node": ">=0.1.90" } @@ -5897,13 +5273,15 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/command-line-args": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, + "peer": true, "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -5919,6 +5297,7 @@ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, + "peer": true, "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -5934,6 +5313,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -5943,6 +5323,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -5976,6 +5357,7 @@ "engines": [ "node >= 0.8" ], + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5988,6 +5370,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6002,13 +5385,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -6024,26 +5409,17 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, + "peer": true, "engines": { "node": ">= 0.6" } }, - "node_modules/core-js-pure": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.0.tgz", - "integrity": "sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "peer": true }, "node_modules/crc-32": { "version": "1.2.2", @@ -6109,27 +5485,17 @@ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, + "peer": true, "engines": { "node": "*" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/death": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/debug": { "version": "4.3.4", @@ -6153,6 +5519,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -6165,6 +5532,7 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, + "peer": true, "dependencies": { "type-detect": "^4.0.0" }, @@ -6177,6 +5545,7 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "peer": true, "engines": { "node": ">=4.0.0" } @@ -6221,71 +5590,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", - "dev": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deferred-leveldown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deferred-leveldown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/deferred-leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/define-data-property": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", @@ -6373,6 +5677,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "peer": true, "engines": { "node": ">= 0.8" } @@ -6382,6 +5687,7 @@ "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, + "peer": true, "dependencies": { "address": "^1.0.1", "debug": "4" @@ -6396,6 +5702,7 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true, + "peer": true, "engines": { "node": ">=0.3.1" } @@ -6414,6 +5721,7 @@ "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, + "peer": true, "dependencies": { "heap": ">= 0.2.0" }, @@ -6463,16 +5771,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.544", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.544.tgz", @@ -6500,44 +5798,18 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", - "dev": true, - "dependencies": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, + "peer": true, "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -6551,32 +5823,11 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "peer": true, "engines": { "node": ">=6" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "peer": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-abstract": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", @@ -6693,6 +5944,7 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, + "peer": true, "dependencies": { "esprima": "^2.7.1", "estraverse": "^1.9.1", @@ -6715,6 +5967,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6724,6 +5977,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "peer": true, "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -6737,6 +5991,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "peer": true, "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -6754,6 +6009,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -6763,6 +6019,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "peer": true, "dependencies": { "prelude-ls": "~1.1.2" }, @@ -6997,6 +6254,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, + "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7047,29 +6305,12 @@ "node": ">=0.10.0" } }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", - "dev": true, - "peer": true, - "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true, - "peer": true - }, "node_modules/eth-gas-reporter": { "version": "0.2.27", "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", "dev": true, + "peer": true, "dependencies": { "@solidity-parser/parser": "^0.14.0", "axios": "^1.5.1", @@ -7104,7 +6345,8 @@ "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "peer": true }, "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { "version": "1.1.5", @@ -7117,6 +6359,7 @@ "url": "https://paulmillr.com/funding/" } ], + "peer": true, "dependencies": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", @@ -7134,6 +6377,7 @@ "url": "https://paulmillr.com/funding/" } ], + "peer": true, "dependencies": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" @@ -7144,6 +6388,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -7153,6 +6398,7 @@ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, + "peer": true, "dependencies": { "object-assign": "^4.1.0", "string-width": "^2.1.1" @@ -7169,6 +6415,7 @@ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, + "peer": true, "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -7176,11 +6423,61 @@ "@scure/bip39": "1.1.1" } }, + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -7190,6 +6487,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, + "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -7203,6 +6501,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^3.0.0" }, @@ -7215,6 +6514,7 @@ "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", "dev": true, + "peer": true, "dependencies": { "js-sha3": "^0.8.0" } @@ -7243,34 +6543,12 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/ethereum-waffle": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz", - "integrity": "sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==", - "dev": true, - "dependencies": { - "@ethereum-waffle/chai": "4.0.10", - "@ethereum-waffle/compiler": "4.0.3", - "@ethereum-waffle/mock-contract": "4.0.4", - "@ethereum-waffle/provider": "4.0.5", - "solc": "0.8.15", - "typechain": "^8.0.0" - }, - "bin": { - "waffle": "bin/waffle" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" - } - }, "node_modules/ethereumjs-abi": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", "dev": true, + "peer": true, "dependencies": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -7281,6 +6559,7 @@ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -7289,7 +6568,8 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/ethereumjs-abi/node_modules/ethereum-cryptography": { "version": "0.1.3", @@ -7297,6 +6577,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -7320,6 +6601,7 @@ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dev": true, + "peer": true, "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -7411,58 +6693,74 @@ } }, "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", + "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", "dev": true, "funding": [ { "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "url": "https://github.com/sponsors/ethers-io/" }, { "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } ], + "peer": true, "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "@adraffy/ens-normalize": "1.9.2", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true, + "peer": true + }, + "node_modules/ethers/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true, + "peer": true + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true, + "peer": true + }, "node_modules/ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dev": true, + "peer": true, "dependencies": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -7476,7 +6774,8 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/ethjs-util": { "version": "0.1.6", @@ -7547,21 +6846,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-base64-decode": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", @@ -7673,6 +6957,7 @@ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, + "peer": true, "dependencies": { "array-back": "^3.0.1" }, @@ -7701,6 +6986,7 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "peer": true, "bin": { "flat": "cli.js" } @@ -7726,677 +7012,137 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ganache": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz", - "integrity": "sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==", - "bundleDependencies": [ - "@trufflesuite/bigint-buffer", - "emittery", - "keccak", - "leveldown", - "secp256k1", - "@types/bn.js", - "@types/lru-cache", - "@types/seedrandom" - ], - "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "@trufflesuite/bigint-buffer": "1.1.10", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "5.1.1", - "@types/seedrandom": "3.0.1", - "emittery": "0.10.0", - "keccak": "3.0.2", - "leveldown": "6.1.0", - "secp256k1": "4.0.3" - }, - "bin": { - "ganache": "dist/node/cli.js", - "ganache-cli": "dist/node/cli.js" - }, - "optionalDependencies": { - "bufferutil": "4.0.5", - "utf-8-validate": "5.0.7" - } - }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", - "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "node-gyp-build": "4.4.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/ganache/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ganache/node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/@types/node": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", - "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/@types/seedrandom": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", - "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/ganache/node_modules/bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/ganache/node_modules/catering": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", - "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "queue-tick": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache/node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "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" - } - }, - "node_modules/ganache/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/ganache/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/ganache/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/ganache/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache/node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache/node_modules/leveldown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", - "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "^7.2.0", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "catering": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/leveldown/node_modules/level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/ganache/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/ganache/node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" } ], - "inBundle": true, - "license": "MIT" + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "node_modules/ganache/node_modules/queue-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", - "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "inBundle": true, - "license": "MIT" + "dependencies": { + "is-callable": "^1.1.3" + } }, - "node_modules/ganache/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, - "inBundle": true, - "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, - "node_modules/ganache/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" + "peer": true }, - "node_modules/ganache/node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", + "peer": true, "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=10" } }, - "node_modules/ganache/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "peer": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, - "node_modules/ganache/node_modules/utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, "dependencies": { - "node-gyp-build": "^4.3.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ganache/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "peer": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "inBundle": true, - "license": "MIT" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -8421,6 +7167,7 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "peer": true, "engines": { "node": "*" } @@ -8454,6 +7201,7 @@ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -8486,20 +7234,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/ghost-testrpc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", "dev": true, + "peer": true, "dependencies": { "chalk": "^2.4.2", "node-emoji": "^1.10.0" @@ -8545,6 +7285,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "peer": true, "dependencies": { "global-prefix": "^3.0.0" }, @@ -8557,6 +7298,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "peer": true, "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -8571,6 +7313,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -8657,6 +7400,7 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -8678,38 +7422,17 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/hardhat": { "version": "2.18.0", "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.0.tgz", "integrity": "sha512-Com3SPFgk6v73LlE3rypuh32DYxOWvNbVBm5xfPUEzGVEW54Fcc4j3Uq7j6COj7S8Jc27uNihLFsveHYM0YJkQ==", "dev": true, + "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -8881,6 +7604,7 @@ "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", "dev": true, + "peer": true, "dependencies": { "array-uniq": "1.0.3", "eth-gas-reporter": "^0.2.25", @@ -8913,6 +7637,7 @@ "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", "dev": true, + "peer": true, "dependencies": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", @@ -8934,7 +7659,8 @@ "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "peer": true }, "node_modules/hardhat/node_modules/@scure/bip32": { "version": "1.1.5", @@ -8947,6 +7673,7 @@ "url": "https://paulmillr.com/funding/" } ], + "peer": true, "dependencies": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", @@ -8964,6 +7691,7 @@ "url": "https://paulmillr.com/funding/" } ], + "peer": true, "dependencies": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" @@ -8973,19 +7701,15 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/hardhat/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true + "dev": true, + "peer": true }, "node_modules/hardhat/node_modules/ethereum-cryptography": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, + "peer": true, "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -8998,6 +7722,7 @@ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dev": true, + "peer": true, "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -9013,6 +7738,7 @@ "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -9023,6 +7749,7 @@ "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, + "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -9046,6 +7773,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^2.0.0" }, @@ -9053,28 +7781,29 @@ "node": ">=4" } }, - "node_modules/hardhat/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/hardhat/node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "node_modules/hardhat/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, - "hasInstallScript": true, + "peer": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=6 <7 || >=8" + } + }, + "node_modules/hardhat/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, "node_modules/hardhat/node_modules/locate-path": { @@ -9082,6 +7811,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -9095,6 +7825,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, + "peer": true, "dependencies": { "p-try": "^1.0.0" }, @@ -9107,6 +7838,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^1.1.0" }, @@ -9119,6 +7851,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -9128,83 +7861,51 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, + "peer": true, "engines": { "node": ">=4" } }, - "node_modules/hardhat/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hardhat/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/hardhat/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/hardhat/node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, + "peer": true, "bin": { - "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" + "semver": "bin/semver.js" } }, - "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "node_modules/hardhat/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "peer": true, + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/hardhat/node_modules/solc/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/hardhat/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, - "bin": { - "semver": "bin/semver" + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/has": { @@ -9314,6 +8015,7 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "peer": true, "bin": { "he": "bin/he" } @@ -9322,7 +8024,8 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/hmac-drbg": { "version": "1.0.1", @@ -9335,17 +8038,12 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, "node_modules/http-basic": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "dev": true, + "peer": true, "dependencies": { "caseless": "^0.12.0", "concat-stream": "^1.6.2", @@ -9361,6 +8059,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "peer": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -9377,6 +8076,7 @@ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "dev": true, + "peer": true, "dependencies": { "@types/node": "^10.0.3" } @@ -9385,28 +8085,15 @@ "version": "10.17.60", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } + "peer": true }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, + "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -9444,6 +8131,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -9451,19 +8139,6 @@ "node": ">=0.10.0" } }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dev": true, - "peer": true, - "dependencies": { - "punycode": "2.1.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -9493,17 +8168,12 @@ "node": ">= 4" } }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", - "dev": true - }, "node_modules/immutable": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/import-fresh": { "version": "3.3.0", @@ -9535,6 +8205,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -9559,7 +8230,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "peer": true }, "node_modules/internal-slot": { "version": "1.0.5", @@ -9580,18 +8252,9 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "dev": true, "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, "node_modules/io-ts": { @@ -9599,6 +8262,7 @@ "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", "dev": true, + "peer": true, "dependencies": { "fp-ts": "^1.0.0" } @@ -9617,13 +8281,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "peer": true - }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -9641,6 +8298,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "peer": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -9683,6 +8341,7 @@ "url": "https://feross.org/support" } ], + "peer": true, "engines": { "node": ">=4" } @@ -9840,6 +8499,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -9929,17 +8589,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -9947,19 +8602,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true, - "peer": true - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -10021,12 +8663,6 @@ "unfetch": "^4.2.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -10619,6 +9255,7 @@ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", "dev": true, + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -10648,12 +9285,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -10666,27 +9297,12 @@ "node": ">=4" } }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dev": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10699,12 +9315,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -10718,10 +9328,14 @@ } }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -10731,34 +9345,21 @@ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", "dev": true, + "peer": true, "engines": { "node": "*" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "dev": true, "hasInstallScript": true, "dependencies": { "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, "engines": { "node": ">=10.0.0" @@ -10799,21 +9400,6 @@ "ieee754": "^1.2.1" } }, - "node_modules/keccak256/node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -10828,6 +9414,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -10837,135 +9424,27 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "dev": true, + "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.9" } }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dev": true, - "peer": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/level": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, + "peer": true, "dependencies": { "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", - "dev": true, - "dependencies": { - "buffer": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-codec/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", - "dev": true, - "dependencies": { - "errno": "~0.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-mem": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", - "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", - "dev": true, - "dependencies": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", - "dev": true, - "dependencies": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" + "classic-level": "^1.2.0" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" } }, "node_modules/level-supports": { @@ -10973,6 +9452,7 @@ "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "dev": true, + "peer": true, "engines": { "node": ">=12" } @@ -10982,6 +9462,7 @@ "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, + "peer": true, "dependencies": { "buffer": "^6.0.3", "module-error": "^1.0.1" @@ -11009,53 +9490,12 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, - "node_modules/level-ws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", - "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", - "dev": true, - "dependencies": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levelup/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -11142,33 +9582,6 @@ } } }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -11190,18 +9603,26 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", - "dev": true, - "peer": true - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "peer": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true, + "peer": true }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -11213,13 +9634,15 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, + "peer": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -11236,6 +9659,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11251,6 +9675,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11267,6 +9692,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11278,13 +9704,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -11294,6 +9722,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11379,6 +9808,7 @@ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dev": true, + "peer": true, "dependencies": { "get-func-name": "^2.0.0" } @@ -11387,7 +9817,8 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/lru-cache": { "version": "5.1.1", @@ -11398,12 +9829,6 @@ "yallist": "^3.0.2" } }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", - "dev": true - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -11423,13 +9848,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/mcl-wasm": { "version": "0.7.9", "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", "dev": true, + "peer": true, "engines": { "node": ">=8.9.0" } @@ -11445,86 +9872,12 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", - "dev": true, - "dependencies": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/memdown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/memdown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/memdown/node_modules/immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "dev": true - }, - "node_modules/memdown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/memory-level": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", "dev": true, + "peer": true, "dependencies": { "abstract-level": "^1.0.0", "functional-red-black-tree": "^1.0.1", @@ -11539,6 +9892,7 @@ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, + "peer": true, "engines": { "node": ">= 0.10.0" } @@ -11558,20 +9912,6 @@ "node": ">= 8" } }, - "node_modules/merkle-patricia-tree": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", - "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", - "dev": true, - "dependencies": { - "@types/levelup": "^4.3.0", - "ethereumjs-util": "^7.1.4", - "level-mem": "^5.0.1", - "level-ws": "^2.0.0", - "readable-stream": "^3.6.0", - "semaphore-async-await": "^1.5.1" - } - }, "node_modules/micro-ftch": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", @@ -11591,25 +9931,6 @@ "node": ">=8.6" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -11681,6 +10002,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -11693,6 +10015,7 @@ "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", "dev": true, + "peer": true, "dependencies": { "obliterator": "^2.0.0" } @@ -11702,6 +10025,7 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, + "peer": true, "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -11888,6 +10212,7 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -11897,6 +10222,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -11906,6 +10232,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, @@ -11918,6 +10245,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -11927,6 +10255,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -11938,13 +10267,15 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11960,6 +10291,7 @@ "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -11975,6 +10307,7 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, + "peer": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11986,7 +10319,8 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -11998,7 +10332,8 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/node-addon-api": { "version": "2.0.2", @@ -12011,6 +10346,7 @@ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, + "peer": true, "dependencies": { "lodash": "^4.17.21" } @@ -12036,9 +10372,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", "dev": true, "bin": { "node-gyp-build": "bin.js", @@ -12072,6 +10408,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, + "peer": true, "dependencies": { "abbrev": "1" }, @@ -12079,29 +10416,6 @@ "nopt": "bin/nopt.js" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "peer": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -12138,21 +10452,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/number-to-bn": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", "dev": true, + "peer": true, "dependencies": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -12166,22 +10471,15 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, - "engines": { - "node": "*" - } + "peer": true }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12226,7 +10524,8 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/once": { "version": "1.4.0", @@ -12287,24 +10586,19 @@ "node": ">= 0.8.0" } }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", "dev": true, - "peer": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "peer": true }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12344,6 +10638,7 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "peer": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -12379,26 +10674,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, - "peer": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "peer": true }, "node_modules/path-exists": { "version": "4.0.0", @@ -12431,7 +10708,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/path-starts-with": { "version": "2.0.1", @@ -12456,6 +10734,7 @@ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, + "peer": true, "engines": { "node": "*" } @@ -12476,12 +10755,6 @@ "node": ">=0.12" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -12509,39 +10782,17 @@ "pidtree": "bin/pidtree.js" }, "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "node": ">=0.10" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "peer": true, - "dependencies": { - "pinkie": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/pirates": { @@ -12646,13 +10897,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "peer": true }, "node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -12683,34 +10936,29 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, "node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, + "peer": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/queue-microtask": { @@ -12747,6 +10995,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "peer": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -12763,87 +11012,6 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", - "dev": true, - "peer": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "peer": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "peer": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -12863,6 +11031,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "peer": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -12875,6 +11044,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, + "peer": true, "dependencies": { "resolve": "^1.1.6" }, @@ -12887,6 +11057,7 @@ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, + "peer": true, "dependencies": { "minimatch": "^3.0.5" }, @@ -12899,6 +11070,7 @@ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -12925,6 +11097,7 @@ "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", "dev": true, + "peer": true, "dependencies": { "req-from": "^2.0.0" }, @@ -12937,6 +11110,7 @@ "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", "dev": true, + "peer": true, "dependencies": { "resolve-from": "^3.0.0" }, @@ -12949,66 +11123,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -13019,27 +11138,21 @@ } }, "node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true, - "peer": true - }, "node_modules/resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, + "peer": true, "dependencies": { "path-parse": "^1.0.6" }, @@ -13147,23 +11260,17 @@ } }, "node_modules/rlp": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", - "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", "dev": true, "dependencies": { - "bn.js": "^4.11.1" + "bn.js": "^5.2.0" }, "bin": { "rlp": "bin/rlp" } }, - "node_modules/rlp/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/run-applescript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", @@ -13310,6 +11417,7 @@ "url": "https://feross.org/support" } ], + "peer": true, "dependencies": { "queue-microtask": "^1.2.2" } @@ -13318,7 +11426,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/safe-array-concat": { "version": "1.0.1", @@ -13382,13 +11491,15 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/sc-istanbul": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, + "peer": true, "dependencies": { "abbrev": "1.0.x", "async": "1.x", @@ -13414,21 +11525,17 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "dependencies": { "sprintf-js": "~1.0.2" } }, - "node_modules/sc-istanbul/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true - }, "node_modules/sc-istanbul/node_modules/glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, + "peer": true, "dependencies": { "inflight": "^1.0.4", "inherits": "2", @@ -13445,6 +11552,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -13454,6 +11562,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -13467,6 +11576,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -13479,13 +11589,15 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/sc-istanbul/node_modules/supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^1.0.0" }, @@ -13498,6 +11610,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -13526,21 +11639,6 @@ "node": ">=10.0.0" } }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "dev": true - }, - "node_modules/semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", - "dev": true, - "engines": { - "node": ">=4.1" - } - }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -13579,17 +11677,11 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "peer": true - }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -13614,7 +11706,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/sha.js": { "version": "2.4.11", @@ -13634,6 +11727,7 @@ "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, + "peer": true, "dependencies": { "charenc": ">= 0.0.1", "crypt": ">= 0.0.1" @@ -13668,6 +11762,7 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "peer": true, "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -13738,33 +11833,71 @@ } }, "node_modules/solc": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", - "integrity": "sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", "dev": true, + "peer": true, "dependencies": { "command-exists": "^1.2.8", - "commander": "^8.1.0", + "commander": "3.0.2", "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", "js-sha3": "0.8.0", "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", "semver": "^5.5.0", "tmp": "0.0.33" }, "bin": { - "solcjs": "solc.js" + "solcjs": "solcjs" }, "engines": { - "node": ">=10.0.0" + "node": ">=8.0.0" } }, "node_modules/solc/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", "dev": true, - "engines": { - "node": ">= 12" + "peer": true + }, + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solc/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, "node_modules/solc/node_modules/semver": { @@ -13772,6 +11905,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "peer": true, "bin": { "semver": "bin/semver" } @@ -13796,6 +11930,7 @@ "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.5.tgz", "integrity": "sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==", "dev": true, + "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.9", "@solidity-parser/parser": "^0.16.0", @@ -13830,6 +11965,7 @@ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", "dev": true, + "peer": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } @@ -13839,6 +11975,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -13853,18 +11990,39 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, + "peer": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/solidity-coverage/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solidity-coverage/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">= 4.0.0" } }, "node_modules/source-map": { @@ -13873,6 +12031,7 @@ "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, + "peer": true, "dependencies": { "amdefine": ">=0.0.4" }, @@ -13885,6 +12044,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -13895,83 +12055,17 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "peer": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true, - "peer": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "peer": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true, - "peer": true - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -13998,6 +12092,7 @@ "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", "dev": true, + "peer": true, "dependencies": { "type-fest": "^0.7.1" }, @@ -14010,6 +12105,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -14019,6 +12115,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "peer": true, "engines": { "node": ">= 0.8" } @@ -14045,7 +12142,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/string-width": { "version": "4.2.3", @@ -14127,19 +12225,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dev": true, - "peer": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -14203,6 +12288,7 @@ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", "dev": true, + "peer": true, "dependencies": { "http-response-object": "^3.0.1", "sync-rpc": "^1.2.1", @@ -14217,6 +12303,7 @@ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", "dev": true, + "peer": true, "dependencies": { "get-port": "^3.1.0" } @@ -14248,6 +12335,7 @@ "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, + "peer": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -14264,6 +12352,7 @@ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, + "peer": true, "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -14279,6 +12368,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -14288,6 +12378,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -14297,6 +12388,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -14313,6 +12405,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -14328,6 +12421,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -14339,13 +12433,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/table/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -14354,22 +12450,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "peer": true }, "node_modules/table/node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -14396,14 +12485,6 @@ "node": ">=8" } }, - "node_modules/testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.", - "dev": true, - "peer": true - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -14415,6 +12496,7 @@ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", "dev": true, + "peer": true, "dependencies": { "@types/concat-stream": "^1.6.0", "@types/form-data": "0.0.33", @@ -14436,13 +12518,15 @@ "version": "8.10.66", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/then-request/node_modules/form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "dev": true, + "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -14469,6 +12553,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, + "peer": true, "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -14508,32 +12593,11 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "peer": true, "engines": { "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -14557,6 +12621,7 @@ "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, + "peer": true, "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", @@ -14572,6 +12637,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -14587,6 +12653,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14603,6 +12670,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -14614,13 +12682,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/ts-command-line-args/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -14630,6 +12700,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -14642,6 +12713,7 @@ "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, + "peer": true, "peerDependencies": { "typescript": ">=3.7.0" } @@ -14708,19 +12780,8 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } + "peer": true }, "node_modules/tweetnacl": { "version": "1.0.3", @@ -14751,6 +12812,7 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -14772,6 +12834,7 @@ "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.1.tgz", "integrity": "sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==", "dev": true, + "peer": true, "dependencies": { "@types/prettier": "^2.1.1", "debug": "^4.3.1", @@ -14791,11 +12854,27 @@ "typescript": ">=4.3.0" } }, + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -14811,11 +12890,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -14828,6 +12918,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -14838,6 +12929,16 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", @@ -14907,7 +13008,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/typescript": { "version": "5.2.2", @@ -14927,6 +13029,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -14937,6 +13040,7 @@ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true, + "peer": true, "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -14978,12 +13082,13 @@ "dev": true }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true, + "peer": true, "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/unpipe": { @@ -14991,6 +13096,7 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "peer": true, "engines": { "node": ">= 0.8" } @@ -15043,37 +13149,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "dev": true, - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.2" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/url/node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", @@ -15101,31 +13176,6 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "peer": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -15140,6 +13190,7 @@ "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.2.tgz", "integrity": "sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==", "dev": true, + "peer": true, "dependencies": { "@ethereumjs/util": "^8.1.0", "bn.js": "^5.2.1", @@ -15201,13 +13252,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", - "dev": true, - "peer": true - }, "node_modules/which-typed-array": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", @@ -15227,24 +13271,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", - "dev": true, - "peer": true, - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -15253,13 +13285,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/wordwrapjs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, + "peer": true, "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -15273,6 +13307,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -15281,7 +13316,8 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/wrap-ansi": { "version": "8.1.0", @@ -15382,12 +13418,13 @@ } }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "dev": true, + "peer": true, "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -15402,15 +13439,6 @@ } } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -15440,6 +13468,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "peer": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -15458,6 +13487,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "dev": true, + "peer": true, "engines": { "node": ">=10" } @@ -15467,6 +13497,7 @@ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, + "peer": true, "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -15482,6 +13513,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, + "peer": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index b7561798..28abe896 100644 --- a/package.json +++ b/package.json @@ -35,30 +35,20 @@ "devDependencies": { "@chainsafe/ssz": "0.13.0", "@metamask/eth-sig-util": "7.0.0", - "@nomiclabs/hardhat-ethers": "2.2.3", - "@nomiclabs/hardhat-etherscan": "3.1.7", - "@nomiclabs/hardhat-waffle": "2.0.6", - "@openzeppelin/hardhat-upgrades": "1.28.0", + "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@openzeppelin/hardhat-upgrades": "2.3.1", "@openzeppelin/merkle-tree": "1.0.5", - "@typechain/ethers-v5": "11.0.0", - "@typechain/hardhat": "7.0.0", - "@types/mocha": "10.0.2", "@types/node": "20.8.3", "@typescript-eslint/eslint-plugin": "6.7.4", "@typescript-eslint/parser": "6.7.4", "bls-eth-wasm": "1.1.0", - "chai": "4.3.10", "dotenv": "16.3.1", "eslint": "8.51.0", "eslint-config-prettier": "9.0.0", "eslint-plugin-prettier": "5.0.0", - "ethereum-waffle": "4.0.10", "ethereumjs-wallet": "1.0.2", - "ethers": "5.7.2", - "hardhat": "2.18.0", "hardhat-abi-exporter": "2.10.1", "hardhat-contract-sizer": "2.10.0", - "hardhat-gas-reporter": "1.0.9", "hardhat-log-remover": "2.0.2", "hardhat-spdx-license-identifier": "2.1.0", "husky": "8.0.3", @@ -67,9 +57,7 @@ "mocha-chai-jest-snapshot": "1.1.4", "prettier": "3.0.3", "prettier-plugin-solidity": "1.1.3", - "solidity-coverage": "0.8.5", "ts-node": "10.9.1", - "typechain": "8.3.1", "typescript": "5.2.2" }, "lint-staged": { diff --git a/tasks/eth-full-deploy-local.ts b/tasks/eth-full-deploy-local.ts index 59b6b036..c860b41a 100644 --- a/tasks/eth-full-deploy-local.ts +++ b/tasks/eth-full-deploy-local.ts @@ -1,4 +1,3 @@ -import '@nomiclabs/hardhat-ethers' import fs from 'fs' import '@openzeppelin/hardhat-upgrades/dist/type-extensions' import { task } from 'hardhat/config' @@ -15,7 +14,6 @@ import { CumulativeMerkleDrop__factory, } from '../typechain-types' import { deployContract } from '../helpers/utils' -import { getContractAddress } from 'ethers/lib/utils' import { NetworkConfig, Networks } from '../helpers/types' import { ethValidatorsRegistry, NETWORKS } from '../helpers/constants' @@ -36,7 +34,8 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ const validatorsMinOracles = 2 const vaultsRegistry = await deployContract(new VaultsRegistry__factory(deployer).deploy()) - console.log('VaultsRegistry deployed at', vaultsRegistry.address) + const vaultsRegistryAddress = await vaultsRegistry.getAddress() + console.log('VaultsRegistry deployed at', vaultsRegistryAddress) const validatorsRegistry = await deployContract( ( @@ -47,21 +46,23 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ ) ).deploy() ) - console.log('ValidatorsRegistry deployed at', validatorsRegistry.address) + const validatorsRegistryAddress = await validatorsRegistry.getAddress() + console.log('ValidatorsRegistry deployed at', validatorsRegistryAddress) const sharedMevEscrow = await deployContract( - new SharedMevEscrow__factory(deployer).deploy(vaultsRegistry.address) + new SharedMevEscrow__factory(deployer).deploy(vaultsRegistryAddress) ) - console.log('SharedMevEscrow deployed at', sharedMevEscrow.address) + const sharedMevEscrowAddress = await sharedMevEscrow.getAddress() + console.log('SharedMevEscrow deployed at', sharedMevEscrowAddress) - const keeperCalculatedAddress = getContractAddress({ + const keeperCalculatedAddress = ethers.getCreateAddress({ from: deployer.address, - nonce: (await deployer.getTransactionCount()) + 1, + nonce: (await ethers.provider.getTransactionCount(deployer.address)) + 1, }) const osToken = await deployContract( new OsToken__factory(deployer).deploy( keeperCalculatedAddress, - vaultsRegistry.address, + vaultsRegistryAddress, treasury.address, goerliConfig.osTokenFeePercent, goerliConfig.osTokenCapacity, @@ -69,22 +70,24 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ goerliConfig.osTokenSymbol ) ) - console.log('OsToken deployed at', osToken.address) + const osTokenAddress = await osToken.getAddress() + console.log('OsToken deployed at', osTokenAddress) const keeper = await deployContract( new Keeper__factory(deployer).deploy( - sharedMevEscrow.address, - vaultsRegistry.address, - osToken.address, + sharedMevEscrowAddress, + vaultsRegistryAddress, + osTokenAddress, goerliConfig.rewardsDelay, goerliConfig.maxAvgRewardPerSecond, - validatorsRegistry.address + validatorsRegistryAddress ) ) - if (keeper.address !== keeperCalculatedAddress) { + const keeperAddress = await keeper.getAddress() + if (keeperAddress !== keeperCalculatedAddress) { throw new Error('Keeper address mismatch') } - console.log('Keeper deployed at', keeper.address) + console.log('Keeper deployed at', keeperAddress) for (let i = 0; i < oracles.length; i++) { await keeper.addOracle(oracles[i].address) @@ -112,39 +115,41 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ const vaultImpl = (await upgrades.deployImplementation(vault, { unsafeAllow: ['delegatecall'], constructorArgs: [ - keeper.address, - vaultsRegistry.address, - validatorsRegistry.address, - osToken.address, + keeperAddress, + vaultsRegistryAddress, + validatorsRegistryAddress, + osTokenAddress, osTokenConfig.address, - sharedMevEscrow.address, + sharedMevEscrowAddress, ], })) as string console.log(`${vaultType} implementation deployed at`, vaultImpl) const ethVaultFactory = await deployContract( - new EthVaultFactory__factory(deployer).deploy(vaultImpl, vaultsRegistry.address) + new EthVaultFactory__factory(deployer).deploy(vaultImpl, vaultsRegistryAddress) ) - console.log(`${vaultType}Factory deployed at`, ethVaultFactory.address) + const ethVaultFactoryAddress = await ethVaultFactory.getAddress() + console.log(`${vaultType}Factory deployed at`, ethVaultFactoryAddress) - await vaultsRegistry.addFactory(ethVaultFactory.address) + await vaultsRegistry.addFactory(ethVaultFactoryAddress) console.log(`Added ${vaultType}Factory to VaultsRegistry`) await osToken.setVaultImplementation(vaultImpl, true) console.log(`Added ${vaultType} implementation to OsToken`) - factories.push(ethVaultFactory.address) + factories.push(ethVaultFactoryAddress) } const priceFeed = await deployContract( - new PriceFeed__factory(deployer).deploy(osToken.address, goerliConfig.priceFeedDescription) + new PriceFeed__factory(deployer).deploy(osTokenAddress, goerliConfig.priceFeedDescription) ) console.log('PriceFeed deployed at', priceFeed.address) const rewardSplitterImpl = await deployContract(new RewardSplitter__factory(deployer).deploy()) - console.log('RewardSplitter implementation deployed at', rewardSplitterImpl.address) + const rewardSplitterImplAddress = await rewardSplitterImpl.getAddress() + console.log('RewardSplitter implementation deployed at', rewardSplitterImplAddress) const rewardSplitterFactory = await deployContract( - new RewardSplitterFactory__factory(deployer).deploy(rewardSplitterImpl.address) + new RewardSplitterFactory__factory(deployer).deploy(rewardSplitterImplAddress) ) console.log('RewardSplitterFactory deployed at', rewardSplitterFactory.address) @@ -163,21 +168,21 @@ task('eth-full-deploy-local', 'deploys StakeWise V3 for Ethereum to local networ console.log('Ownership transferred to governor') // accept ownership from governor - await keeper.connect(governor).acceptOwnership() - await osToken.connect(governor).acceptOwnership() - await vaultsRegistry.connect(governor).acceptOwnership() + await Keeper__factory.connect(keeperAddress, governor).acceptOwnership() + await OsToken__factory.connect(osTokenAddress, governor).acceptOwnership() + await VaultsRegistry__factory.connect(vaultsRegistryAddress, governor).acceptOwnership() console.log('Ownership accepted from governor') // Save the addresses const addresses = { - VaultsRegistry: vaultsRegistry.address, - Keeper: keeper.address, + VaultsRegistry: vaultsRegistryAddress, + Keeper: keeperAddress, EthVaultFactory: factories[0], EthPrivVaultFactory: factories[1], EthErc20VaultFactory: factories[2], EthPrivErc20VaultFactory: factories[3], - SharedMevEscrow: sharedMevEscrow.address, - OsToken: osToken.address, + SharedMevEscrow: sharedMevEscrowAddress, + OsToken: osTokenAddress, OsTokenConfig: osTokenConfig.address, PriceFeed: priceFeed.address, RewardSplitterFactory: rewardSplitterFactory.address, diff --git a/tasks/eth-full-deploy.ts b/tasks/eth-full-deploy.ts index e0f31f56..5603d1a4 100644 --- a/tasks/eth-full-deploy.ts +++ b/tasks/eth-full-deploy.ts @@ -1,4 +1,3 @@ -import '@nomiclabs/hardhat-ethers' import fs from 'fs' import '@openzeppelin/hardhat-upgrades/dist/type-extensions' import { task } from 'hardhat/config' @@ -17,13 +16,8 @@ import { import { deployContract, verify } from '../helpers/utils' import { NETWORKS } from '../helpers/constants' import { NetworkConfig } from '../helpers/types' -import { getContractAddress } from 'ethers/lib/utils' const DEPLOYMENTS_DIR = 'deployments' -const FEE_DATA = { - maxFeePerGas: '364053996066', - maxPriorityFeePerGas: '305657672', -} task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (taskArgs, hre) => { const upgrades = hre.upgrades @@ -31,41 +25,34 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta const networkName = hre.network.name const networkConfig: NetworkConfig = NETWORKS[networkName] - // Wrap the provider so we can override fee data. - const provider = new ethers.providers.FallbackProvider([ethers.provider], 1) - provider.getFeeData = async () => FEE_DATA - // Create the signer for the mnemonic, connected to the provider with hardcoded fee data - const deployer = ethers.Wallet.fromMnemonic(process.env.MNEMONIC).connect(provider) + const deployer = ethers.Wallet.fromPhrase(process.env.MNEMONIC as string).connect(ethers.provider) const vaultsRegistry = await deployContract(new VaultsRegistry__factory(deployer).deploy()) - console.log('VaultsRegistry deployed at', vaultsRegistry.address) - await verify( - hre, - vaultsRegistry.address, - [], - 'contracts/vaults/VaultsRegistry.sol:VaultsRegistry' - ) + const vaultsRegistryAddress = await vaultsRegistry.getAddress() + console.log('VaultsRegistry deployed at', vaultsRegistryAddress) + await verify(hre, vaultsRegistryAddress, [], 'contracts/vaults/VaultsRegistry.sol:VaultsRegistry') const sharedMevEscrow = await deployContract( - new SharedMevEscrow__factory(deployer).deploy(vaultsRegistry.address) + new SharedMevEscrow__factory(deployer).deploy(vaultsRegistryAddress) ) - console.log('SharedMevEscrow deployed at', sharedMevEscrow.address) + const sharedMevEscrowAddress = await sharedMevEscrow.getAddress() + console.log('SharedMevEscrow deployed at', sharedMevEscrowAddress) await verify( hre, - sharedMevEscrow.address, - [vaultsRegistry.address], + sharedMevEscrowAddress, + [vaultsRegistryAddress], 'contracts/vaults/ethereum/mev/SharedMevEscrow.sol:SharedMevEscrow' ) - const keeperCalculatedAddress = getContractAddress({ + const keeperCalculatedAddress = ethers.getCreateAddress({ from: deployer.address, - nonce: (await deployer.getTransactionCount()) + 1, + nonce: (await ethers.provider.getTransactionCount(deployer.address)) + 1, }) const osToken = await deployContract( new OsToken__factory(deployer).deploy( keeperCalculatedAddress, - vaultsRegistry.address, + vaultsRegistryAddress, networkConfig.treasury, networkConfig.osTokenFeePercent, networkConfig.osTokenCapacity, @@ -73,13 +60,14 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta networkConfig.osTokenSymbol ) ) - console.log('OsToken deployed at', osToken.address) + const osTokenAddress = await osToken.getAddress() + console.log('OsToken deployed at', osTokenAddress) await verify( hre, - osToken.address, + osTokenAddress, [ keeperCalculatedAddress, - vaultsRegistry.address, + vaultsRegistryAddress, networkConfig.treasury, networkConfig.osTokenFeePercent, networkConfig.osTokenCapacity, @@ -91,18 +79,19 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta const keeper = await deployContract( new Keeper__factory(deployer).deploy( - sharedMevEscrow.address, - vaultsRegistry.address, - osToken.address, + sharedMevEscrowAddress, + vaultsRegistryAddress, + osTokenAddress, networkConfig.rewardsDelay, networkConfig.maxAvgRewardPerSecond, networkConfig.validatorsRegistry ) ) - if (keeper.address !== keeperCalculatedAddress) { + const keeperAddress = await keeper.getAddress() + if (keeperAddress !== keeperCalculatedAddress) { throw new Error('Keeper address mismatch') } - console.log('Keeper deployed at', keeper.address) + console.log('Keeper deployed at', keeperAddress) for (let i = 0; i < networkConfig.oracles.length; i++) { await keeper.addOracle(networkConfig.oracles[i]) @@ -112,11 +101,11 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta await keeper.setValidatorsMinOracles(networkConfig.validatorsMinOracles) await verify( hre, - keeper.address, + keeperAddress, [ - sharedMevEscrow.address, - vaultsRegistry.address, - osToken.address, + sharedMevEscrowAddress, + vaultsRegistryAddress, + osTokenAddress, networkConfig.rewardsDelay, networkConfig.maxAvgRewardPerSecond, networkConfig.validatorsRegistry, @@ -133,10 +122,11 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta ltvPercent: networkConfig.ltvPercent, }) ) - console.log('OsTokenConfig deployed at', osTokenConfig.address) + const osTokenConfigAddress = await osTokenConfig.getAddress() + console.log('OsTokenConfig deployed at', osTokenConfigAddress) await verify( hre, - osTokenConfig.address, + osTokenConfigAddress, [ networkConfig.governor, { @@ -156,12 +146,12 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta const vaultImpl = (await upgrades.deployImplementation(vault, { unsafeAllow: ['delegatecall'], constructorArgs: [ - keeper.address, - vaultsRegistry.address, + keeperAddress, + vaultsRegistryAddress, networkConfig.validatorsRegistry, - osToken.address, - osTokenConfig.address, - sharedMevEscrow.address, + osTokenAddress, + osTokenConfigAddress, + sharedMevEscrowAddress, ], })) as string console.log(`${vaultType} implementation deployed at`, vaultImpl) @@ -169,33 +159,34 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta hre, vaultImpl, [ - keeper.address, - vaultsRegistry.address, + keeperAddress, + vaultsRegistryAddress, networkConfig.validatorsRegistry, - osToken.address, - osTokenConfig.address, - sharedMevEscrow.address, + osTokenAddress, + osTokenConfigAddress, + sharedMevEscrowAddress, ], `contracts/vaults/ethereum/${vaultType}.sol:${vaultType}` ) const ethVaultFactory = await deployContract( - new EthVaultFactory__factory(deployer).deploy(vaultImpl, vaultsRegistry.address) + new EthVaultFactory__factory(deployer).deploy(vaultImpl, vaultsRegistryAddress) ) - console.log(`${vaultType}Factory deployed at`, ethVaultFactory.address) + const ethVaultFactoryAddress = await ethVaultFactory.getAddress() + console.log(`${vaultType}Factory deployed at`, ethVaultFactoryAddress) await verify( hre, - ethVaultFactory.address, - [vaultImpl, vaultsRegistry.address], + ethVaultFactoryAddress, + [vaultImpl, vaultsRegistryAddress], 'contracts/vaults/ethereum/EthVaultFactory.sol:EthVaultFactory' ) - await vaultsRegistry.addFactory(ethVaultFactory.address) + await vaultsRegistry.addFactory(ethVaultFactoryAddress) console.log(`Added ${vaultType}Factory to VaultsRegistry`) await osToken.setVaultImplementation(vaultImpl, true) console.log(`Added ${vaultType} implementation to OsToken`) - factories.push(ethVaultFactory.address) + factories.push(ethVaultFactoryAddress) } const ethGenesisVaultFactory = await ethers.getContractFactory('EthGenesisVault') @@ -203,19 +194,20 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta unsafeAllow: ['delegatecall'], initializer: false, constructorArgs: [ - keeper.address, - vaultsRegistry.address, + keeperAddress, + vaultsRegistryAddress, networkConfig.validatorsRegistry, - osToken.address, - osTokenConfig.address, - sharedMevEscrow.address, + osTokenAddress, + osTokenConfigAddress, + sharedMevEscrowAddress, networkConfig.genesisVault.poolEscrow, networkConfig.genesisVault.rewardEthToken, ], }) + const ethGenesisVaultAddress = await ethGenesisVault.getAddress() await ethGenesisVault.deployed() const tx = await ethGenesisVault.initialize( - ethers.utils.defaultAbiCoder.encode( + ethers.AbiCoder.defaultAbiCoder().encode( ['address', 'tuple(uint256 capacity, uint16 feePercent, string metadataIpfsHash)'], [ networkConfig.genesisVault.admin, @@ -225,9 +217,9 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta { value: networkConfig.securityDeposit } ) await tx.wait() - console.log(`EthGenesisVault deployed at`, ethGenesisVault.address) + console.log(`EthGenesisVault deployed at`, ethGenesisVaultAddress) - await vaultsRegistry.addVault(ethGenesisVault.address) + await vaultsRegistry.addVault(ethGenesisVaultAddress) console.log('Added EthGenesisVault to VaultsRegistry') const ethGenesisVaultImpl = await ethGenesisVault.implementation() @@ -235,14 +227,14 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta console.log(`Added EthGenesisVault implementation to OsToken`) await verify( hre, - ethGenesisVault.address, + ethGenesisVaultAddress, [ - keeper.address, - vaultsRegistry.address, + keeperAddress, + vaultsRegistryAddress, networkConfig.validatorsRegistry, - osToken.address, - osTokenConfig.address, - sharedMevEscrow.address, + osTokenAddress, + osTokenConfigAddress, + sharedMevEscrowAddress, networkConfig.genesisVault.poolEscrow, networkConfig.genesisVault.rewardEthToken, ], @@ -250,32 +242,35 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta ) const priceFeed = await deployContract( - new PriceFeed__factory(deployer).deploy(osToken.address, networkConfig.priceFeedDescription) + new PriceFeed__factory(deployer).deploy(osTokenAddress, networkConfig.priceFeedDescription) ) - console.log('PriceFeed deployed at', priceFeed.address) + const priceFeedAddress = await priceFeed.getAddress() + console.log('PriceFeed deployed at', priceFeedAddress) await verify( hre, - priceFeed.address, - [osToken.address, networkConfig.priceFeedDescription], + priceFeedAddress, + [osTokenAddress, networkConfig.priceFeedDescription], 'contracts/osToken/PriceFeed.sol:PriceFeed' ) const rewardSplitterImpl = await deployContract(new RewardSplitter__factory(deployer).deploy()) - console.log('RewardSplitter implementation deployed at', rewardSplitterImpl.address) + const rewardSplitterImplAddress = await rewardSplitterImpl.getAddress() + console.log('RewardSplitter implementation deployed at', rewardSplitterImplAddress) await verify( hre, - rewardSplitterImpl.address, + rewardSplitterImplAddress, [], 'contracts/misc/RewardSplitter.sol:RewardSplitter' ) const rewardSplitterFactory = await deployContract( - new RewardSplitterFactory__factory(deployer).deploy(rewardSplitterImpl.address) + new RewardSplitterFactory__factory(deployer).deploy(rewardSplitterImplAddress) ) - console.log('RewardSplitterFactory deployed at', rewardSplitterFactory.address) + const rewardSplitterFactoryAddress = await rewardSplitterFactory.getAddress() + console.log('RewardSplitterFactory deployed at', rewardSplitterFactoryAddress) await verify( hre, - rewardSplitterFactory.address, + rewardSplitterFactoryAddress, [rewardSplitterImpl], 'contracts/misc/RewardSplitterFactory.sol:RewardSplitterFactory' ) @@ -286,10 +281,11 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta networkConfig.swiseToken ) ) - console.log('CumulativeMerkleDrop deployed at', cumulativeMerkleDrop.address) + const cumulativeMerkleDropAddress = await cumulativeMerkleDrop.getAddress() + console.log('CumulativeMerkleDrop deployed at', cumulativeMerkleDropAddress) await verify( hre, - cumulativeMerkleDrop.address, + cumulativeMerkleDropAddress, [networkConfig.liquidityCommittee, networkConfig.swiseToken], 'contracts/misc/CumulativeMerkleDrop.sol:CumulativeMerkleDrop' ) @@ -301,18 +297,18 @@ task('eth-full-deploy', 'deploys StakeWise V3 for Ethereum').setAction(async (ta // Save the addresses const addresses = { - VaultsRegistry: vaultsRegistry.address, - Keeper: keeper.address, - EthGenesisVault: ethGenesisVault.address, + VaultsRegistry: vaultsRegistryAddress, + Keeper: keeperAddress, + EthGenesisVault: ethGenesisVaultAddress, EthVaultFactory: factories[0], EthPrivVaultFactory: factories[1], EthErc20VaultFactory: factories[2], EthPrivErc20VaultFactory: factories[3], - SharedMevEscrow: sharedMevEscrow.address, - OsToken: osToken.address, - OsTokenConfig: osTokenConfig.address, - PriceFeed: priceFeed.address, - RewardSplitterFactory: rewardSplitterFactory.address, + SharedMevEscrow: sharedMevEscrowAddress, + OsToken: osTokenAddress, + OsTokenConfig: osTokenConfigAddress, + PriceFeed: priceFeedAddress, + RewardSplitterFactory: rewardSplitterFactoryAddress, } const json = JSON.stringify(addresses, null, 2) const fileName = `${DEPLOYMENTS_DIR}/${networkName}.json` diff --git a/test/CumulativeMerkleDrop.spec.ts b/test/CumulativeMerkleDrop.spec.ts index 33051b9b..f269ad74 100644 --- a/test/CumulativeMerkleDrop.spec.ts +++ b/test/CumulativeMerkleDrop.spec.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat' -import { BigNumber, BigNumberish, Wallet } from 'ethers' -import { CumulativeMerkleDrop, ERC20Mock } from '../typechain-types' +import { BigNumberish, Wallet } from 'ethers' +import { CumulativeMerkleDrop, ERC20Mock, ERC20Mock__factory } from '../typechain-types' import { createCumulativeMerkleDrop } from './shared/fixtures' import { StandardMerkleTree } from '@openzeppelin/merkle-tree' import { expect } from './shared/expect' @@ -11,17 +11,17 @@ type RewardsTree = StandardMerkleTree<[string, BigNumberish]> describe('CumulativeMerkleDrop', () => { const proofsIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' - const rewards: { address: string; reward: number }[] = [ - { address: '0x5E0375cFD64e036b37f74EbD213B061a0fFd6CC0', reward: 283 }, - { address: '0x3D238CccC9839f012ee613D1076F747093A25F16', reward: 649 }, - { address: '0xb12F7f27A07AB869761FF2bD11943db317a06466', reward: 779 }, - { address: '0x267a0909ea6043550D7054957061dC01eDd2915F', reward: 573 }, - { address: '0x03079134787b4570952Eacb53Bef82a7AF773fED', reward: 959 }, - { address: '0x704e14dFf77cdA4155BBC7b6AA8d3B39810aAE91', reward: 563 }, - { address: '0xC1016a99a8b37fDE1cFddf638f3d8Ec5B14c7d78', reward: 444 }, - { address: '0x6aBb7fFd8ad5770A90640ce7ca7647fA98a48702', reward: 172 }, - { address: '0x6c9A2c104D10fcA6510eF4B2c1E778aA94b50A5a', reward: 969 }, - { address: '0x408bdc9EF95A89F3B200eCb02dffEFEb87650da4', reward: 327 }, + const rewards: { address: string; reward: bigint }[] = [ + { address: '0x5E0375cFD64e036b37f74EbD213B061a0fFd6CC0', reward: 283n }, + { address: '0x3D238CccC9839f012ee613D1076F747093A25F16', reward: 649n }, + { address: '0xb12F7f27A07AB869761FF2bD11943db317a06466', reward: 779n }, + { address: '0x267a0909ea6043550D7054957061dC01eDd2915F', reward: 573n }, + { address: '0x03079134787b4570952Eacb53Bef82a7AF773fED', reward: 959n }, + { address: '0x704e14dFf77cdA4155BBC7b6AA8d3B39810aAE91', reward: 563n }, + { address: '0xC1016a99a8b37fDE1cFddf638f3d8Ec5B14c7d78', reward: 444n }, + { address: '0x6aBb7fFd8ad5770A90640ce7ca7647fA98a48702', reward: 172n }, + { address: '0x6c9A2c104D10fcA6510eF4B2c1E778aA94b50A5a', reward: 969n }, + { address: '0x408bdc9EF95A89F3B200eCb02dffEFEb87650da4', reward: 327n }, ] const tree: RewardsTree = StandardMerkleTree.of( rewards.map((r) => [r.address, r.reward]), @@ -30,20 +30,18 @@ describe('CumulativeMerkleDrop', () => { let dao: Wallet, sender: Wallet let merkleDrop: CumulativeMerkleDrop, token: ERC20Mock - before('create fixture loader', async () => { - ;[dao, sender] = await (ethers as any).getSigners() - }) - beforeEach('deploy fixtures', async () => { + ;[dao, sender] = await (ethers as any).getSigners() const factory = await ethers.getContractFactory('ERC20Mock') - token = (await factory.deploy()) as ERC20Mock - merkleDrop = await createCumulativeMerkleDrop(token.address, dao) + const contract = await factory.deploy() + token = ERC20Mock__factory.connect(await contract.getAddress(), dao) + merkleDrop = await createCumulativeMerkleDrop(await token.getAddress(), dao) - let totalReward = BigNumber.from(0) + let totalReward = 0n for (let i = 0; i < 10; i++) { - totalReward = totalReward.add(rewards[i].reward) + totalReward += rewards[i].reward } - await token.mint(merkleDrop.address, totalReward) + await token.mint(await merkleDrop.getAddress(), totalReward) }) describe('set merkle root', () => { @@ -76,7 +74,7 @@ describe('CumulativeMerkleDrop', () => { reward.reward, tree.getProof([rewards[1].address, rewards[1].reward]) ) - ).revertedWith('InvalidProof') + ).revertedWithCustomError(merkleDrop, 'InvalidProof') }) it('reverts with cumulative amount less than previous', async () => { @@ -86,7 +84,7 @@ describe('CumulativeMerkleDrop', () => { reward.reward, tree.getProof([reward.address, reward.reward]) ) - const newRewards = [{ address: reward.address, reward: reward.reward - 1 }] + const newRewards = [{ address: reward.address, reward: reward.reward - 1n }] const newTree = StandardMerkleTree.of( newRewards.map((r) => [r.address, r.reward]), ['address', 'uint256'] @@ -100,7 +98,7 @@ describe('CumulativeMerkleDrop', () => { reward.reward, newTree.getProof([reward.address, reward.reward]) ) - ).revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('works with valid proof', async () => { @@ -120,7 +118,7 @@ describe('CumulativeMerkleDrop', () => { reward.reward, tree.getProof([reward.address, reward.reward]) ) - ).revertedWith('AlreadyClaimed') + ).revertedWithCustomError(merkleDrop, 'AlreadyClaimed') }) }) }) diff --git a/test/EthErc20Vault.spec.ts b/test/EthErc20Vault.spec.ts index a95177cc..735cd67f 100644 --- a/test/EthErc20Vault.spec.ts +++ b/test/EthErc20Vault.spec.ts @@ -1,9 +1,9 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Contract, Wallet } from 'ethers' -import { hexlify, parseEther } from 'ethers/lib/utils' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthErc20Vault, Keeper } from '../typechain-types' import snapshotGasCost from './shared/snapshotGasCost' -import { ethVaultFixture } from './shared/fixtures' +import { createDepositorMock, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' import { SECURITY_DEPOSIT, ZERO_ADDRESS } from './shared/constants' import { collateralizeEthVault, getRewardsRootProof, updateRewards } from './shared/rewards' @@ -11,27 +11,20 @@ import { setBalance } from './shared/utils' import { registerEthValidator } from './shared/validators' import keccak256 from 'keccak256' -const createFixtureLoader = waffle.createFixtureLoader -const validatorDeposit = parseEther('32') +const validatorDeposit = ethers.parseEther('32') describe('EthErc20Vault', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const name = 'SW ETH Vault' const symbol = 'SW-ETH-1' const feePercent = 1000 const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' const referrer = '0x' + '1'.repeat(40) - let dao: Wallet, sender: Wallet, receiver: Wallet, admin: Wallet + let sender: Wallet, receiver: Wallet, admin: Wallet let vault: EthErc20Vault, keeper: Keeper, validatorsRegistry: Contract - let loadFixture: ReturnType - - before('create fixture loader', async () => { - ;[dao, sender, receiver, admin] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) - beforeEach('deploy fixtures', async () => { + ;[sender, receiver, admin] = (await (ethers as any).getSigners()).slice(1, 4) const fixture = await loadFixture(ethVaultFixture) vault = await fixture.createEthErc20Vault(admin, { capacity, @@ -45,7 +38,7 @@ describe('EthErc20Vault', () => { }) it('has id', async () => { - expect(await vault.vaultId()).to.eq(hexlify(keccak256('EthErc20Vault'))) + expect(await vault.vaultId()).to.eq('0x' + keccak256('EthErc20Vault').toString('hex')) }) it('has version', async () => { @@ -53,8 +46,8 @@ describe('EthErc20Vault', () => { }) it('deposit emits transfer event', async () => { - const amount = parseEther('100') - const expectedShares = parseEther('100') + const amount = ethers.parseEther('100') + const expectedShares = ethers.parseEther('100') expect(await vault.convertToShares(amount)).to.eq(expectedShares) const receipt = await vault @@ -72,29 +65,29 @@ describe('EthErc20Vault', () => { }) it('deposit through receive fallback function emits transfer event', async () => { - const depositorMockFactory = await ethers.getContractFactory('DepositorMock') - const depositorMock = await depositorMockFactory.deploy(vault.address) + const depositorMock = await createDepositorMock(vault) + const depositorMockAddress = await depositorMock.getAddress() - const amount = parseEther('100') - const expectedShares = parseEther('100') + const amount = ethers.parseEther('100') + const expectedShares = ethers.parseEther('100') expect(await vault.convertToShares(amount)).to.eq(expectedShares) const receipt = await depositorMock.connect(sender).depositToVault({ value: amount }) - expect(await vault.balanceOf(depositorMock.address)).to.eq(expectedShares) + expect(await vault.balanceOf(depositorMockAddress)).to.eq(expectedShares) await expect(receipt) .to.emit(vault, 'Deposited') - .withArgs(depositorMock.address, depositorMock.address, amount, expectedShares, ZERO_ADDRESS) + .withArgs(depositorMockAddress, depositorMockAddress, amount, expectedShares, ZERO_ADDRESS) await expect(receipt) .to.emit(vault, 'Transfer') - .withArgs(ZERO_ADDRESS, depositorMock.address, expectedShares) + .withArgs(ZERO_ADDRESS, depositorMockAddress, expectedShares) await snapshotGasCost(receipt) }) it('redeem emits transfer event', async () => { - const amount = parseEther('100') + const amount = ethers.parseEther('100') await vault.connect(sender).deposit(sender.address, referrer, { value: amount }) - const receiverBalanceBefore = await waffle.provider.getBalance(receiver.address) + const receiverBalanceBefore = await ethers.provider.getBalance(receiver.address) const receipt = await vault.connect(sender).redeem(amount, receiver.address) await expect(receipt) .to.emit(vault, 'Redeemed') @@ -104,9 +97,9 @@ describe('EthErc20Vault', () => { expect(await vault.totalAssets()).to.be.eq(SECURITY_DEPOSIT) expect(await vault.totalSupply()).to.be.eq(SECURITY_DEPOSIT) expect(await vault.balanceOf(sender.address)).to.be.eq(0) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq(SECURITY_DEPOSIT) - expect(await waffle.provider.getBalance(receiver.address)).to.be.eq( - receiverBalanceBefore.add(amount) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq(SECURITY_DEPOSIT) + expect(await ethers.provider.getBalance(receiver.address)).to.be.eq( + receiverBalanceBefore + amount ) await snapshotGasCost(receipt) @@ -116,7 +109,7 @@ describe('EthErc20Vault', () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) expect(await vault.queuedShares()).to.be.eq(0) - const amount = parseEther('100') + const amount = ethers.parseEther('100') await vault.connect(sender).deposit(sender.address, referrer, { value: amount }) expect(await vault.balanceOf(sender.address)).to.be.eq(amount) @@ -124,7 +117,9 @@ describe('EthErc20Vault', () => { await expect(receipt) .to.emit(vault, 'ExitQueueEntered') .withArgs(sender.address, receiver.address, validatorDeposit, amount) - await expect(receipt).to.emit(vault, 'Transfer').withArgs(sender.address, vault.address, amount) + await expect(receipt) + .to.emit(vault, 'Transfer') + .withArgs(sender.address, await vault.getAddress(), amount) expect(await vault.queuedShares()).to.be.eq(amount) expect(await vault.balanceOf(sender.address)).to.be.eq(0) @@ -132,68 +127,75 @@ describe('EthErc20Vault', () => { }) it('update exit queue emits transfer event', async () => { - const validatorDeposit = parseEther('32') + const validatorDeposit = ethers.parseEther('32') await vault.connect(admin).deposit(admin.address, ZERO_ADDRESS, { value: validatorDeposit }) await registerEthValidator(vault, keeper, validatorsRegistry, admin) const rewardsTree = await updateRewards(keeper, [ - { vault: vault.address, reward: 0, unlockedMevReward: 0 }, + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, ]) const proof = getRewardsRootProof(rewardsTree, { - vault: vault.address, - reward: 0, - unlockedMevReward: 0, + vault: await vault.getAddress(), + reward: 0n, + unlockedMevReward: 0n, }) // exit validator - await vault.connect(admin).callStatic.enterExitQueue(validatorDeposit, admin.address) await vault.connect(admin).enterExitQueue(validatorDeposit, admin.address) - await setBalance(vault.address, validatorDeposit) + await setBalance(await vault.getAddress(), validatorDeposit) const receipt = await vault.updateState({ rewardsRoot: rewardsTree.root, - reward: 0, - unlockedMevReward: 0, + reward: 0n, + unlockedMevReward: 0n, proof, }) await expect(receipt) .to.emit(vault, 'Transfer') - .withArgs(vault.address, ZERO_ADDRESS, validatorDeposit) + .withArgs(await vault.getAddress(), ZERO_ADDRESS, validatorDeposit) await snapshotGasCost(receipt) }) it('cannot transfer vault shares when unharvested', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const assets = parseEther('2') - const osTokenShares = parseEther('1') + const assets = ethers.parseEther('2') + const osTokenShares = ethers.parseEther('1') await vault.connect(sender).deposit(sender.address, ZERO_ADDRESS, { value: assets }) await vault.connect(sender).mintOsToken(receiver.address, osTokenShares, ZERO_ADDRESS) await updateRewards(keeper, [ - { vault: vault.address, reward: parseEther('1'), unlockedMevReward: parseEther('0') }, + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1'), + unlockedMevReward: ethers.parseEther('0'), + }, ]) await updateRewards(keeper, [ - { vault: vault.address, reward: parseEther('1.2'), unlockedMevReward: parseEther('0') }, + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1.2'), + unlockedMevReward: ethers.parseEther('0'), + }, ]) - await expect(vault.connect(sender).transfer(receiver.address, assets)).to.be.revertedWith( - 'NotHarvested' - ) + await expect( + vault.connect(sender).transfer(receiver.address, assets) + ).to.be.revertedWithCustomError(vault, 'NotHarvested') }) it('cannot transfer vault shares when LTV is violated', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const assets = parseEther('2') - const osTokenShares = parseEther('1') + const assets = ethers.parseEther('2') + const osTokenShares = ethers.parseEther('1') await vault.connect(sender).deposit(sender.address, ZERO_ADDRESS, { value: assets }) await vault.connect(sender).mintOsToken(receiver.address, osTokenShares, ZERO_ADDRESS) - await expect(vault.connect(sender).transfer(receiver.address, assets)).to.be.revertedWith( - 'LowLtv' - ) + await expect( + vault.connect(sender).transfer(receiver.address, assets) + ).to.be.revertedWithCustomError(vault, 'LowLtv') await vault.connect(sender).approve(receiver.address, assets) await expect( vault.connect(receiver).transferFrom(sender.address, receiver.address, assets) - ).to.be.revertedWith('LowLtv') + ).to.be.revertedWithCustomError(vault, 'LowLtv') }) }) diff --git a/test/EthGenesisVault.spec.ts b/test/EthGenesisVault.spec.ts index 6d667c47..7771ed15 100644 --- a/test/EthGenesisVault.spec.ts +++ b/test/EthGenesisVault.spec.ts @@ -1,8 +1,19 @@ -import { ethers, upgrades, waffle } from 'hardhat' -import { BigNumber, Contract, Wallet } from 'ethers' -import { hexlify, parseEther } from 'ethers/lib/utils' -import { EthGenesisVault, Keeper, PoolEscrowMock, RewardEthTokenMock } from '../typechain-types' -import { createPoolEscrow, ethVaultFixture, getOraclesSignatures } from './shared/fixtures' +import { ethers, upgrades } from 'hardhat' +import { Contract, Wallet } from 'ethers' +import { + EthGenesisVault, + EthGenesisVault__factory, + Keeper, + PoolEscrowMock, + RewardEthTokenMock, + RewardEthTokenMock__factory, +} from '../typechain-types' +import { + createDepositorMock, + createPoolEscrow, + ethVaultFixture, + getOraclesSignatures, +} from './shared/fixtures' import { expect } from './shared/expect' import keccak256 from 'keccak256' import { @@ -29,11 +40,10 @@ import { increaseTime, setBalance, } from './shared/utils' - -const createFixtureLoader = waffle.createFixtureLoader +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' describe('EthGenesisVault', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' const deadline = VALIDATORS_DEADLINE @@ -42,42 +52,39 @@ describe('EthGenesisVault', () => { let poolEscrow: PoolEscrowMock let rewardEthToken: RewardEthTokenMock - let loadFixture: ReturnType - - before('create fixture loader', async () => { - ;[dao, admin, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) - beforeEach('deploy fixtures', async () => { + ;[dao, admin, other] = await (ethers as any).getSigners() const fixture = await loadFixture(ethVaultFixture) keeper = fixture.keeper validatorsRegistry = fixture.validatorsRegistry let factory = await ethers.getContractFactory('RewardEthTokenMock') - rewardEthToken = (await factory.deploy()) as RewardEthTokenMock + rewardEthToken = RewardEthTokenMock__factory.connect( + await (await factory.deploy()).getAddress(), + dao + ) poolEscrow = await createPoolEscrow(dao.address) factory = await ethers.getContractFactory('EthGenesisVault') const proxy = await upgrades.deployProxy(factory, [], { unsafeAllow: ['delegatecall'], initializer: false, constructorArgs: [ - fixture.keeper.address, - fixture.vaultsRegistry.address, - fixture.validatorsRegistry.address, - fixture.osToken.address, - fixture.osTokenConfig.address, - fixture.sharedMevEscrow.address, - poolEscrow.address, - rewardEthToken.address, + await fixture.keeper.getAddress(), + await fixture.vaultsRegistry.getAddress(), + await fixture.validatorsRegistry.getAddress(), + await fixture.osToken.getAddress(), + await fixture.osTokenConfig.getAddress(), + await fixture.sharedMevEscrow.getAddress(), + await poolEscrow.getAddress(), + await rewardEthToken.getAddress(), EXITING_ASSETS_MIN_DELAY, ], }) - vault = (await proxy.deployed()) as EthGenesisVault - await rewardEthToken.setVault(vault.address) - await poolEscrow.connect(dao).commitOwnershipTransfer(vault.address) + vault = EthGenesisVault__factory.connect(await proxy.getAddress(), dao) + await rewardEthToken.setVault(await vault.getAddress()) + await poolEscrow.connect(dao).commitOwnershipTransfer(await vault.getAddress()) const tx = await vault.initialize( - ethers.utils.defaultAbiCoder.encode( + ethers.AbiCoder.defaultAbiCoder().encode( ['address', 'tuple(uint256 capacity, uint16 feePercent, string metadataIpfsHash)'], [admin.address, [capacity, feePercent, metadataIpfsHash]] ), @@ -89,9 +96,9 @@ describe('EthGenesisVault', () => { await expect(tx) .to.emit(vault, 'GenesisVaultCreated') .withArgs(admin.address, capacity, feePercent, metadataIpfsHash) - expect(await vault.mevEscrow()).to.be.eq(fixture.sharedMevEscrow.address) + expect(await vault.mevEscrow()).to.be.eq(await fixture.sharedMevEscrow.getAddress()) - await fixture.vaultsRegistry.connect(dao).addVault(vault.address) + await fixture.vaultsRegistry.connect(dao).addVault(await vault.getAddress()) }) it('initializes correctly', async () => { @@ -105,7 +112,7 @@ describe('EthGenesisVault', () => { // VaultVersion expect(await vault.version()).to.be.eq(1) - expect(await vault.vaultId()).to.be.eq(hexlify(keccak256('EthGenesisVault'))) + expect(await vault.vaultId()).to.be.eq(`0x${keccak256('EthGenesisVault').toString('hex')}`) // VaultFee expect(await vault.feeRecipient()).to.be.eq(admin.address) @@ -117,11 +124,12 @@ describe('EthGenesisVault', () => { }) it('applies ownership transfer', async () => { - expect(await poolEscrow.owner()).to.eq(vault.address) + expect(await poolEscrow.owner()).to.eq(await vault.getAddress()) }) it('apply ownership cannot be called second time', async () => { - await expect(vault.connect(other).acceptPoolEscrowOwnership()).to.be.revertedWith( + await expect(vault.connect(other).acceptPoolEscrowOwnership()).to.be.revertedWithCustomError( + vault, 'AccessDenied' ) await expect(vault.connect(admin).acceptPoolEscrowOwnership()).to.be.revertedWith( @@ -131,59 +139,59 @@ describe('EthGenesisVault', () => { describe('migrate', () => { it('fails from not rewardEthToken', async () => { - await expect(vault.connect(admin).migrate(admin.address, parseEther('1'))).to.be.revertedWith( - 'AccessDenied' - ) + await expect( + vault.connect(admin).migrate(admin.address, ethers.parseEther('1')) + ).to.be.revertedWithCustomError(vault, 'AccessDenied') }) it('fails with zero receiver', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const assets = parseEther('1') + const assets = ethers.parseEther('1') await expect( rewardEthToken.connect(other).migrate(ZERO_ADDRESS, assets, assets) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) it('fails with zero assets', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - await expect(rewardEthToken.connect(other).migrate(other.address, 0, 0)).to.be.revertedWith( - 'InvalidAssets' - ) + await expect( + rewardEthToken.connect(other).migrate(other.address, 0, 0) + ).to.be.revertedWithCustomError(vault, 'InvalidAssets') }) it('fails when not collateralized', async () => { - const assets = parseEther('1') + const assets = ethers.parseEther('1') await expect( rewardEthToken.connect(other).migrate(other.address, assets, assets) - ).to.be.revertedWith('NotCollateralized') + ).to.be.revertedWithCustomError(vault, 'NotCollateralized') }) it('fails when not harvested', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) await updateRewards(keeper, [ { - reward: parseEther('5'), - unlockedMevReward: 0, - vault: vault.address, + reward: ethers.parseEther('5'), + unlockedMevReward: 0n, + vault: await vault.getAddress(), }, ]) await updateRewards(keeper, [ { - reward: parseEther('10'), - unlockedMevReward: 0, - vault: vault.address, + reward: ethers.parseEther('10'), + unlockedMevReward: 0n, + vault: await vault.getAddress(), }, ]) - const assets = parseEther('1') + const assets = ethers.parseEther('1') await expect( rewardEthToken.connect(other).migrate(other.address, assets, assets) - ).to.be.revertedWith('NotHarvested') + ).to.be.revertedWithCustomError(vault, 'NotHarvested') }) it('migrates from rewardEthToken', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const assets = parseEther('10') - const expectedShares = parseEther('10') + const assets = ethers.parseEther('10') + const expectedShares = ethers.parseEther('10') expect(await vault.convertToShares(assets)).to.eq(expectedShares) const receipt = await rewardEthToken.connect(other).migrate(other.address, assets, 0) @@ -199,35 +207,34 @@ describe('EthGenesisVault', () => { it('pulls assets on claim exited assets', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const shares = parseEther('10') + const shares = ethers.parseEther('10') await vault.connect(other).deposit(other.address, ZERO_ADDRESS, { value: shares }) - await setBalance(vault.address, BigNumber.from(0)) + await setBalance(await vault.getAddress(), 0n) const response = await vault.connect(other).enterExitQueue(shares, other.address) - const receipt = await response.wait() - const positionTicket = extractExitPositionTicket(receipt) - const timestamp = await getBlockTimestamp(receipt) + const positionTicket = await extractExitPositionTicket(response) + const timestamp = await getBlockTimestamp(response) - await setBalance(poolEscrow.address, shares) + await setBalance(await poolEscrow.getAddress(), shares) expect(await vault.withdrawableAssets()).to.eq(0) await increaseTime(ONE_DAY) const tree = await updateRewards(keeper, [ { - reward: 0, - unlockedMevReward: 0, - vault: vault.address, + reward: 0n, + unlockedMevReward: 0n, + vault: await vault.getAddress(), }, ]) const proof = getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, - reward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, + reward: 0n, }) await vault.updateState({ rewardsRoot: tree.root, - reward: 0, - unlockedMevReward: 0, + reward: 0n, + unlockedMevReward: 0n, proof, }) const exitQueueIndex = await vault.getExitQueueIndex(positionTicket) @@ -235,20 +242,22 @@ describe('EthGenesisVault', () => { const tx = await vault .connect(other) .claimExitedAssets(positionTicket, timestamp, exitQueueIndex) - await expect(tx).to.emit(poolEscrow, 'Withdrawn').withArgs(vault.address, vault.address, shares) + await expect(tx) + .to.emit(poolEscrow, 'Withdrawn') + .withArgs(await vault.getAddress(), await vault.getAddress(), shares) await expect(tx) .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(other.address, positionTicket, 0, shares) - expect(await waffle.provider.getBalance(poolEscrow.address)).to.eq(0) + expect(await ethers.provider.getBalance(await poolEscrow.getAddress())).to.eq(0) await snapshotGasCost(tx) }) it('pulls assets on redeem', async () => { - const shares = parseEther('10') + const shares = ethers.parseEther('10') await vault.connect(other).deposit(other.address, ZERO_ADDRESS, { value: shares }) - await setBalance(vault.address, BigNumber.from(0)) - await setBalance(poolEscrow.address, shares) + await setBalance(await vault.getAddress(), 0n) + await setBalance(await poolEscrow.getAddress(), shares) expect(await vault.withdrawableAssets()).to.eq(shares) @@ -257,21 +266,23 @@ describe('EthGenesisVault', () => { .to.emit(vault, 'Redeemed') .withArgs(other.address, other.address, shares, shares) await expect(tx).to.not.emit(vault, 'Deposited') - await expect(tx).to.emit(poolEscrow, 'Withdrawn').withArgs(vault.address, vault.address, shares) - expect(await waffle.provider.getBalance(poolEscrow.address)).to.eq(0) + await expect(tx) + .to.emit(poolEscrow, 'Withdrawn') + .withArgs(await vault.getAddress(), await vault.getAddress(), shares) + expect(await ethers.provider.getBalance(await poolEscrow.getAddress())).to.eq(0) }) it('pulls assets on single validator registration', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const validatorDeposit = parseEther('32') + const validatorDeposit = ethers.parseEther('32') await rewardEthToken.connect(other).migrate(other.address, validatorDeposit, validatorDeposit) - await setBalance(vault.address, BigNumber.from(0)) - await setBalance(poolEscrow.address, validatorDeposit) + await setBalance(await vault.getAddress(), 0n) + await setBalance(await poolEscrow.getAddress(), validatorDeposit) expect(await vault.withdrawableAssets()).to.eq(validatorDeposit) const tx = await registerEthValidator(vault, keeper, validatorsRegistry, admin) await expect(tx) .to.emit(poolEscrow, 'Withdrawn') - .withArgs(vault.address, vault.address, validatorDeposit) + .withArgs(await vault.getAddress(), await vault.getAddress(), validatorDeposit) await snapshotGasCost(tx) }) @@ -284,7 +295,7 @@ describe('EthGenesisVault', () => { ...Array(validatorsData.validators.length).keys(), ]) const validators = validatorsData.validators - const assets = parseEther('32').mul(validators.length) + const assets = ethers.parseEther('32') * BigInt(validators.length) await rewardEthToken.connect(other).migrate(other.address, assets, assets) const sortedVals = proof.leaves.map((v) => v[0]) @@ -292,7 +303,7 @@ describe('EthGenesisVault', () => { await vault.connect(other).deposit(other.address, ZERO_ADDRESS, { value: assets }) const exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] - const signingData = getEthValidatorsSigningData( + const signingData = await getEthValidatorsSigningData( Buffer.concat(validators), deadline, exitSignaturesIpfsHash, @@ -302,60 +313,65 @@ describe('EthGenesisVault', () => { ) const approveParams = { validatorsRegistryRoot, - validators: hexlify(Buffer.concat(validators)), + validators: `0x${Buffer.concat(validators).toString('hex')}`, signatures: getOraclesSignatures(signingData, ORACLES.length), exitSignaturesIpfsHash, deadline, } - await setBalance(vault.address, BigNumber.from(0)) - await setBalance(poolEscrow.address, assets) + await setBalance(await vault.getAddress(), 0n) + await setBalance(await poolEscrow.getAddress(), assets) expect(await vault.withdrawableAssets()).to.eq(assets) const tx = await vault.registerValidators(approveParams, indexes, proof.proofFlags, proof.proof) - await expect(tx).to.emit(poolEscrow, 'Withdrawn').withArgs(vault.address, vault.address, assets) + await expect(tx) + .to.emit(poolEscrow, 'Withdrawn') + .withArgs(await vault.getAddress(), await vault.getAddress(), assets) await snapshotGasCost(tx) }) it('can deposit through receive fallback function', async () => { - const depositorMockFactory = await ethers.getContractFactory('DepositorMock') - const depositorMock = await depositorMockFactory.deploy(vault.address) - - const amount = parseEther('100') - const expectedShares = parseEther('100') + const depositorMock = await createDepositorMock(vault) + const amount = ethers.parseEther('100') + const expectedShares = ethers.parseEther('100') expect(await vault.convertToShares(amount)).to.eq(expectedShares) const receipt = await depositorMock.connect(other).depositToVault({ value: amount }) - expect(await vault.getShares(depositorMock.address)).to.eq(expectedShares) + expect(await vault.getShares(await depositorMock.getAddress())).to.eq(expectedShares) await expect(receipt) .to.emit(vault, 'Deposited') - .withArgs(depositorMock.address, depositorMock.address, amount, expectedShares, ZERO_ADDRESS) + .withArgs( + await depositorMock.getAddress(), + await depositorMock.getAddress(), + amount, + expectedShares, + ZERO_ADDRESS + ) await snapshotGasCost(receipt) }) describe('update state', () => { - const totalVaultAssets: BigNumber = parseEther('10') - const totalLegacyAssets: BigNumber = parseEther('5') + const totalVaultAssets: bigint = ethers.parseEther('10') + const totalLegacyAssets: bigint = ethers.parseEther('5') beforeEach(async () => { await vault.deposit(other.address, ZERO_ADDRESS, { - value: totalVaultAssets.sub(SECURITY_DEPOSIT), + value: totalVaultAssets - SECURITY_DEPOSIT, }) await rewardEthToken.connect(other).setTotalStaked(totalLegacyAssets) }) it('splits reward between rewardEthToken and vault', async () => { - const totalRewards = parseEther('30') - const expectedVaultDelta = totalRewards - .mul(totalVaultAssets) - .div(totalLegacyAssets.add(totalVaultAssets)) - const expectedLegacyDelta = totalRewards.sub(expectedVaultDelta) + const totalRewards = ethers.parseEther('30') + const expectedVaultDelta = + (totalRewards * totalVaultAssets) / (totalLegacyAssets + totalVaultAssets) + const expectedLegacyDelta = totalRewards - expectedVaultDelta const vaultReward = { reward: totalRewards, - unlockedMevReward: 0, - vault: vault.address, + unlockedMevReward: 0n, + vault: await vault.getAddress(), } const rewardsTree = await updateRewards(keeper, [vaultReward]) const proof = getRewardsRootProof(rewardsTree, vaultReward) @@ -366,17 +382,17 @@ describe('EthGenesisVault', () => { proof, }) - expect(await rewardEthToken.totalAssets()).to.eq(totalLegacyAssets.add(expectedLegacyDelta)) - expect(await vault.totalAssets()).to.eq(totalVaultAssets.add(expectedVaultDelta)) + expect(await rewardEthToken.totalAssets()).to.eq(totalLegacyAssets + expectedLegacyDelta) + expect(await vault.totalAssets()).to.eq(totalVaultAssets + expectedVaultDelta) await snapshotGasCost(receipt) }) it('fails with negative first update', async () => { - const totalPenalty = parseEther('-5') + const totalPenalty = ethers.parseEther('-5') const vaultReward = { reward: totalPenalty, - unlockedMevReward: 0, - vault: vault.address, + unlockedMevReward: 0n, + vault: await vault.getAddress(), } const rewardsTree = await updateRewards(keeper, [vaultReward]) const proof = getRewardsRootProof(rewardsTree, vaultReward) @@ -387,20 +403,19 @@ describe('EthGenesisVault', () => { unlockedMevReward: vaultReward.unlockedMevReward, proof, }) - ).to.revertedWith('NegativeAssetsDelta') + ).to.revertedWithCustomError(vault, 'NegativeAssetsDelta') }) it('splits penalty between rewardEthToken and vault', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const totalPenalty = parseEther('-5') - const expectedVaultDelta = totalPenalty - .mul(totalVaultAssets) - .div(totalLegacyAssets.add(totalVaultAssets)) - const expectedLegacyDelta = totalPenalty.sub(expectedVaultDelta) + const totalPenalty = ethers.parseEther('-5') + const expectedVaultDelta = + (totalPenalty * totalVaultAssets) / (totalLegacyAssets + totalVaultAssets) + const expectedLegacyDelta = totalPenalty - expectedVaultDelta const vaultReward = { reward: totalPenalty, - unlockedMevReward: 0, - vault: vault.address, + unlockedMevReward: 0n, + vault: await vault.getAddress(), } const rewardsTree = await updateRewards(keeper, [vaultReward]) const proof = getRewardsRootProof(rewardsTree, vaultReward) @@ -411,30 +426,29 @@ describe('EthGenesisVault', () => { proof, }) - expect((await rewardEthToken.totalAssets()).sub(await rewardEthToken.totalPenalty())).to.eq( - totalLegacyAssets.add(expectedLegacyDelta).add(1) // rounding error + expect((await rewardEthToken.totalAssets()) - (await rewardEthToken.totalPenalty())).to.eq( + totalLegacyAssets + expectedLegacyDelta + 1n // rounding error ) - expect(await vault.totalAssets()).to.eq(totalVaultAssets.add(expectedVaultDelta).sub(1)) // rounding error + expect(await vault.totalAssets()).to.eq(totalVaultAssets + expectedVaultDelta - 1n) // rounding error await snapshotGasCost(receipt) }) it('deducts rewards on first state update', async () => { - const totalRewards = parseEther('25') - const legacyRewards = parseEther('5') + const totalRewards = ethers.parseEther('25') + const legacyRewards = ethers.parseEther('5') await rewardEthToken.connect(other).setTotalRewards(legacyRewards) - expect(await rewardEthToken.totalAssets()).to.eq(totalLegacyAssets.add(legacyRewards)) + expect(await rewardEthToken.totalAssets()).to.eq(totalLegacyAssets + legacyRewards) expect(await rewardEthToken.totalRewards()).to.eq(legacyRewards) expect(await vault.totalAssets()).to.eq(totalVaultAssets) - const expectedVaultDelta = totalRewards - .sub(legacyRewards) - .mul(totalVaultAssets) - .div(totalLegacyAssets.add(legacyRewards).add(totalVaultAssets)) - const expectedLegacyDelta = totalRewards.sub(legacyRewards).sub(expectedVaultDelta) + const expectedVaultDelta = + ((totalRewards - legacyRewards) * totalVaultAssets) / + (totalLegacyAssets + legacyRewards + totalVaultAssets) + const expectedLegacyDelta = totalRewards - legacyRewards - expectedVaultDelta const vaultReward = { reward: totalRewards, - unlockedMevReward: 0, - vault: vault.address, + unlockedMevReward: 0n, + vault: await vault.getAddress(), } const rewardsTree = await updateRewards(keeper, [vaultReward]) const proof = getRewardsRootProof(rewardsTree, vaultReward) @@ -446,9 +460,9 @@ describe('EthGenesisVault', () => { }) expect(await rewardEthToken.totalAssets()).to.eq( - totalLegacyAssets.add(legacyRewards).add(expectedLegacyDelta) + totalLegacyAssets + legacyRewards + expectedLegacyDelta ) - expect(await vault.totalAssets()).to.eq(totalVaultAssets.add(expectedVaultDelta)) + expect(await vault.totalAssets()).to.eq(totalVaultAssets + expectedVaultDelta) await snapshotGasCost(receipt) }) }) diff --git a/test/EthPrivErc20Vault.spec.ts b/test/EthPrivErc20Vault.spec.ts index 736c6bc9..8bd007a5 100644 --- a/test/EthPrivErc20Vault.spec.ts +++ b/test/EthPrivErc20Vault.spec.ts @@ -1,36 +1,29 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Contract, Wallet } from 'ethers' -import { hexlify, parseEther } from 'ethers/lib/utils' -import { EthPrivErc20Vault, Keeper, IKeeperRewards } from '../typechain-types' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { EthPrivErc20Vault, IKeeperRewards, Keeper } from '../typechain-types' import { ThenArg } from '../helpers/types' -import { ethVaultFixture } from './shared/fixtures' +import { createDepositorMock, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' import { ZERO_ADDRESS } from './shared/constants' import snapshotGasCost from './shared/snapshotGasCost' import { collateralizeEthVault, getRewardsRootProof, updateRewards } from './shared/rewards' import keccak256 from 'keccak256' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthPrivErc20Vault', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const name = 'SW ETH Vault' const symbol = 'SW-ETH-1' const feePercent = 1000 const referrer = ZERO_ADDRESS const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' - let dao: Wallet, sender: Wallet, admin: Wallet, other: Wallet + let sender: Wallet, admin: Wallet, other: Wallet let vault: EthPrivErc20Vault, keeper: Keeper, validatorsRegistry: Contract - let loadFixture: ReturnType let createPrivateVault: ThenArg>['createEthPrivErc20Vault'] - before('create fixture loader', async () => { - ;[dao, sender, admin, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) - beforeEach('deploy fixtures', async () => { + ;[sender, admin, other] = (await (ethers as any).getSigners()).slice(1, 4) ;({ createEthPrivErc20Vault: createPrivateVault, keeper, @@ -46,7 +39,7 @@ describe('EthPrivErc20Vault', () => { }) it('has id', async () => { - expect(await vault.vaultId()).to.eq(hexlify(keccak256('EthPrivErc20Vault'))) + expect(await vault.vaultId()).to.eq(`0x${keccak256('EthPrivErc20Vault').toString('hex')}`) }) it('has version', async () => { @@ -54,7 +47,7 @@ describe('EthPrivErc20Vault', () => { }) describe('deposit', () => { - const amount = parseEther('1') + const amount = ethers.parseEther('1') beforeEach(async () => { await vault.connect(admin).updateWhitelist(sender.address, true) @@ -63,23 +56,23 @@ describe('EthPrivErc20Vault', () => { it('cannot be called by not whitelisted sender', async () => { await expect( vault.connect(other).deposit(other.address, referrer, { value: amount }) - ).to.revertedWith('AccessDenied') + ).to.revertedWithCustomError(vault, 'AccessDenied') }) it('cannot update state and call', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const vaultReward = parseEther('1') + const vaultReward = ethers.parseEther('1') const tree = await updateRewards(keeper, [ - { reward: vaultReward, unlockedMevReward: 0, vault: vault.address }, + { reward: vaultReward, unlockedMevReward: 0n, vault: await vault.getAddress() }, ]) const harvestParams: IKeeperRewards.HarvestParamsStruct = { rewardsRoot: tree.root, reward: vaultReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, reward: vaultReward, }), } @@ -87,13 +80,13 @@ describe('EthPrivErc20Vault', () => { vault .connect(other) .updateStateAndDeposit(other.address, referrer, harvestParams, { value: amount }) - ).to.revertedWith('AccessDenied') + ).to.revertedWithCustomError(vault, 'AccessDenied') }) it('cannot set receiver to not whitelisted user', async () => { await expect( vault.connect(other).deposit(other.address, referrer, { value: amount }) - ).to.revertedWith('AccessDenied') + ).to.revertedWithCustomError(vault, 'AccessDenied') }) it('can be called by whitelisted user', async () => { @@ -109,33 +102,30 @@ describe('EthPrivErc20Vault', () => { }) it('deposit through receive fallback cannot be called by not whitelisted sender', async () => { - const depositorMockFactory = await ethers.getContractFactory('DepositorMock') - const depositorMock = await depositorMockFactory.deploy(vault.address) - - const amount = parseEther('100') - const expectedShares = parseEther('100') + const depositorMock = await createDepositorMock(vault) + const amount = ethers.parseEther('100') + const expectedShares = ethers.parseEther('100') expect(await vault.convertToShares(amount)).to.eq(expectedShares) - await expect(depositorMock.connect(sender).depositToVault({ value: amount })).to.revertedWith( - 'DepositFailed' - ) + await expect( + depositorMock.connect(sender).depositToVault({ value: amount }) + ).to.revertedWithCustomError(depositorMock, 'DepositFailed') }) it('deposit through receive fallback can be called by whitelisted sender', async () => { - const depositorMockFactory = await ethers.getContractFactory('DepositorMock') - const depositorMock = await depositorMockFactory.deploy(vault.address) - await vault.connect(admin).updateWhitelist(depositorMock.address, true) + const depositorMock = await createDepositorMock(vault) + await vault.connect(admin).updateWhitelist(await depositorMock.getAddress(), true) - const amount = parseEther('100') - const expectedShares = parseEther('100') + const amount = ethers.parseEther('100') + const expectedShares = ethers.parseEther('100') expect(await vault.convertToShares(amount)).to.eq(expectedShares) const receipt = await depositorMock.connect(sender).depositToVault({ value: amount }) - expect(await vault.balanceOf(depositorMock.address)).to.eq(expectedShares) + expect(await vault.balanceOf(await depositorMock.getAddress())).to.eq(expectedShares) await expect(receipt) .to.emit(vault, 'Deposited') .withArgs( - depositorMock.address, - depositorMock.address, + await depositorMock.getAddress(), + await depositorMock.getAddress(), amount, expectedShares, ZERO_ADDRESS diff --git a/test/EthVault.burn.spec.ts b/test/EthVault.burn.spec.ts index 55b664cb..0fe48e0d 100644 --- a/test/EthVault.burn.spec.ts +++ b/test/EthVault.burn.spec.ts @@ -1,38 +1,31 @@ -import { ethers, waffle } from 'hardhat' -import { BigNumber, Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' -import { EthVault, Keeper, OsToken, UnknownVaultMock } from '../typechain-types' +import { ethers } from 'hardhat' +import { Contract, ContractTransactionReceipt, Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { EthVault, Keeper, OsToken } from '../typechain-types' import { ThenArg } from '../helpers/types' import snapshotGasCost from './shared/snapshotGasCost' -import { ethVaultFixture } from './shared/fixtures' +import { createUnknownVaultMock, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' import { ONE_DAY, ZERO_ADDRESS } from './shared/constants' import { collateralizeEthVault } from './shared/rewards' import { increaseTime } from './shared/utils' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVault - burn', () => { - const assets = parseEther('2') - const osTokenAssets = parseEther('1') - const osTokenShares = parseEther('1') + const assets = ethers.parseEther('2') + const osTokenAssets = ethers.parseEther('1') + const osTokenShares = ethers.parseEther('1') const vaultParams = { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', } let sender: Wallet, admin: Wallet, owner: Wallet let vault: EthVault, keeper: Keeper, osToken: OsToken, validatorsRegistry: Contract - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] - before('create fixture loader', async () => { - ;[sender, owner, admin] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) - }) - beforeEach('deploy fixture', async () => { + ;[sender, owner, admin] = (await (ethers as any).getSigners()).slice(1, 4) ;({ createEthVault: createVault, keeper, @@ -48,33 +41,33 @@ describe('EthVault - burn', () => { }) it('cannot burn zero osTokens', async () => { - await expect(vault.connect(sender).burnOsToken(0)).to.be.revertedWith('InvalidShares') + await expect(vault.connect(sender).burnOsToken(0)).to.be.revertedWithCustomError( + vault, + 'InvalidShares' + ) }) it('cannot burn osTokens when nothing is minted', async () => { await osToken.connect(sender).transfer(owner.address, osTokenShares) - await expect(vault.connect(owner).burnOsToken(osTokenShares)).to.be.revertedWith( + await expect(vault.connect(owner).burnOsToken(osTokenShares)).to.be.revertedWithCustomError( + vault, 'InvalidPosition' ) }) it('cannot burn osTokens from unregistered vault', async () => { - const factory = await ethers.getContractFactory('UnknownVaultMock') - const unknownVault = (await factory.deploy( - osToken.address, - await vault.implementation() - )) as UnknownVaultMock - await expect(unknownVault.connect(sender).burnOsToken(osTokenShares)).to.be.revertedWith( - 'AccessDenied' - ) + const unknownVault = await createUnknownVaultMock(osToken, await vault.implementation()) + await expect( + unknownVault.connect(sender).burnOsToken(osTokenShares) + ).to.be.revertedWithCustomError(vault, 'AccessDenied') }) it('updates position accumulated fee', async () => { const treasury = await osToken.treasury() let totalShares = osTokenShares let totalAssets = osTokenAssets - let cumulativeFeePerShare = parseEther('1') - let treasuryShares = BigNumber.from(0) + let cumulativeFeePerShare = ethers.parseEther('1') + let treasuryShares = 0n let positionShares = osTokenShares expect(await osToken.cumulativeFeePerShare()).to.eq(cumulativeFeePerShare) @@ -106,10 +99,10 @@ describe('EthVault - burn', () => { it('burns osTokens', async () => { const tx = await vault.connect(sender).burnOsToken(osTokenShares) - const receipt = await tx.wait() + const receipt = (await tx.wait()) as ContractTransactionReceipt // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - const osTokenAssets = receipt?.events?.find((e: any) => e.event === 'OsTokenBurned')?.args[1] + const osTokenAssets = receipt.logs?.[receipt.logs.length - 1]?.args?.assets expect(await osToken.balanceOf(sender.address)).to.eq(0) expect(await vault.osTokenPositions(sender.address)).to.eq( @@ -123,8 +116,8 @@ describe('EthVault - burn', () => { .withArgs(sender.address, ZERO_ADDRESS, osTokenShares) await expect(tx) .to.emit(osToken, 'Burn') - .withArgs(vault.address, sender.address, osTokenAssets, osTokenShares) + .withArgs(await vault.getAddress(), sender.address, osTokenAssets, osTokenShares) - await snapshotGasCost(receipt) + await snapshotGasCost(tx) }) }) diff --git a/test/EthVault.deposit.spec.ts b/test/EthVault.deposit.spec.ts index 01a963b6..ae7f29d8 100644 --- a/test/EthVault.deposit.spec.ts +++ b/test/EthVault.deposit.spec.ts @@ -1,37 +1,31 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthVault, EthVaultMock, IKeeperRewards, Keeper, SharedMevEscrow } from '../typechain-types' import { ThenArg } from '../helpers/types' import snapshotGasCost from './shared/snapshotGasCost' -import { ethVaultFixture } from './shared/fixtures' +import { createDepositorMock, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' import { PANIC_CODES, SECURITY_DEPOSIT, ZERO_ADDRESS } from './shared/constants' import { getRewardsRootProof, updateRewards } from './shared/rewards' import { registerEthValidator } from './shared/validators' import { setBalance } from './shared/utils' -const createFixtureLoader = waffle.createFixtureLoader -const ether = parseEther('1') +const ether = ethers.parseEther('1') describe('EthVault - deposit', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' const referrer = '0x' + '1'.repeat(40) - let dao: Wallet, sender: Wallet, receiver: Wallet, admin: Wallet, other: Wallet + let sender: Wallet, receiver: Wallet, admin: Wallet, other: Wallet let vault: EthVault, keeper: Keeper, mevEscrow: SharedMevEscrow, validatorsRegistry: Contract - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] let createVaultMock: ThenArg>['createEthVaultMock'] - before('create fixture loader', async () => { - ;[dao, sender, receiver, admin, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) - beforeEach('deploy fixtures', async () => { + ;[sender, receiver, admin, other] = (await (ethers as any).getSigners()).slice(1, 5) ;({ createEthVault: createVault, createEthVaultMock: createVaultMock, @@ -48,8 +42,8 @@ describe('EthVault - deposit', () => { it('fails to deposit to zero address', async () => { await expect( - vault.connect(sender).deposit(ZERO_ADDRESS, referrer, { value: parseEther('999') }) - ).to.be.revertedWith('ZeroAddress') + vault.connect(sender).deposit(ZERO_ADDRESS, referrer, { value: ethers.parseEther('999') }) + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) describe('empty vault: no assets & no shares', () => { @@ -92,66 +86,76 @@ describe('EthVault - deposit', () => { it('deposit', async () => { await expect( ethVaultMock.connect(sender).deposit(receiver.address, referrer, { value: ether }) - ).to.be.revertedWith(PANIC_CODES.DIVISION_BY_ZERO) + ).to.be.revertedWithPanic(PANIC_CODES.DIVISION_BY_ZERO) }) }) describe('full vault: assets & shares', () => { beforeEach(async () => { - await vault.connect(other).deposit(other.address, referrer, { value: parseEther('10') }) + await vault + .connect(other) + .deposit(other.address, referrer, { value: ethers.parseEther('10') }) }) it('status', async () => { - expect(await vault.totalAssets()).to.eq(parseEther('10').add(SECURITY_DEPOSIT)) + expect(await vault.totalAssets()).to.eq(ethers.parseEther('10') + SECURITY_DEPOSIT) }) it('fails with exceeded capacity', async () => { await expect( - vault.connect(sender).deposit(receiver.address, referrer, { value: parseEther('999') }) - ).to.be.revertedWith('CapacityExceeded') + vault + .connect(sender) + .deposit(receiver.address, referrer, { value: ethers.parseEther('999') }) + ).to.be.revertedWithCustomError(vault, 'CapacityExceeded') }) it('fails when not harvested', async () => { - await vault.connect(other).deposit(other.address, referrer, { value: parseEther('32') }) + await vault + .connect(other) + .deposit(other.address, referrer, { value: ethers.parseEther('32') }) await registerEthValidator(vault, keeper, validatorsRegistry, admin) await updateRewards(keeper, [ { - reward: parseEther('5'), - unlockedMevReward: 0, - vault: vault.address, + reward: ethers.parseEther('5'), + unlockedMevReward: 0n, + vault: await vault.getAddress(), }, ]) await updateRewards(keeper, [ { - reward: parseEther('10'), - unlockedMevReward: 0, - vault: vault.address, + reward: ethers.parseEther('10'), + unlockedMevReward: 0n, + vault: await vault.getAddress(), }, ]) await expect( - vault.connect(sender).deposit(receiver.address, referrer, { value: parseEther('10') }) - ).to.be.revertedWith('NotHarvested') + vault + .connect(sender) + .deposit(receiver.address, referrer, { value: ethers.parseEther('10') }) + ).to.be.revertedWithCustomError(vault, 'NotHarvested') }) it('update state and deposit', async () => { - await vault.connect(other).deposit(other.address, referrer, { value: parseEther('32') }) + await vault + .connect(other) + .deposit(other.address, referrer, { value: ethers.parseEther('32') }) await registerEthValidator(vault, keeper, validatorsRegistry, admin) - let vaultReward = parseEther('10') + let vaultReward = ethers.parseEther('10') await updateRewards(keeper, [ { reward: vaultReward, unlockedMevReward: vaultReward, - vault: vault.address, + vault: await vault.getAddress(), }, ]) - vaultReward = vaultReward.add(parseEther('1')) + vaultReward = vaultReward + ethers.parseEther('1') const tree = await updateRewards(keeper, [ { reward: vaultReward, unlockedMevReward: vaultReward, - vault: vault.address, + vault: await vault.getAddress(), }, ]) @@ -160,16 +164,16 @@ describe('EthVault - deposit', () => { reward: vaultReward, unlockedMevReward: vaultReward, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), unlockedMevReward: vaultReward, reward: vaultReward, }), } - await setBalance(mevEscrow.address, vaultReward) - await setBalance(await vault.address, parseEther('5')) - await vault.connect(other).enterExitQueue(parseEther('32'), other.address) + await setBalance(await mevEscrow.getAddress(), vaultReward) + await setBalance(await vault.getAddress(), ethers.parseEther('5')) + await vault.connect(other).enterExitQueue(ethers.parseEther('32'), other.address) - const amount = parseEther('100') + const amount = ethers.parseEther('100') const receipt = await vault .connect(sender) .updateStateAndDeposit(receiver.address, referrer, harvestParams, { value: amount }) @@ -181,8 +185,8 @@ describe('EthVault - deposit', () => { }) it('deposit', async () => { - const amount = parseEther('100') - const expectedShares = parseEther('100') + const amount = ethers.parseEther('100') + const expectedShares = ethers.parseEther('100') expect(await vault.convertToShares(amount)).to.eq(expectedShares) const receipt = await vault @@ -197,25 +201,18 @@ describe('EthVault - deposit', () => { }) it('deposit through receive fallback function', async () => { - const depositorMockFactory = await ethers.getContractFactory('DepositorMock') - const depositorMock = await depositorMockFactory.deploy(vault.address) - - const amount = parseEther('100') - const expectedShares = parseEther('100') + const depositorMock = await createDepositorMock(vault) + const depositorMockAddress = await depositorMock.getAddress() + const amount = ethers.parseEther('100') + const expectedShares = ethers.parseEther('100') expect(await vault.convertToShares(amount)).to.eq(expectedShares) const receipt = await depositorMock.connect(sender).depositToVault({ value: amount }) - expect(await vault.getShares(depositorMock.address)).to.eq(expectedShares) + expect(await vault.getShares(depositorMockAddress)).to.eq(expectedShares) await expect(receipt) .to.emit(vault, 'Deposited') - .withArgs( - depositorMock.address, - depositorMock.address, - amount, - expectedShares, - ZERO_ADDRESS - ) + .withArgs(depositorMockAddress, depositorMockAddress, amount, expectedShares, ZERO_ADDRESS) await snapshotGasCost(receipt) }) }) diff --git a/test/EthVault.liquidate.spec.ts b/test/EthVault.liquidate.spec.ts index a33ae3d5..509cd75d 100644 --- a/test/EthVault.liquidate.spec.ts +++ b/test/EthVault.liquidate.spec.ts @@ -1,6 +1,6 @@ -import { ethers, waffle } from 'hardhat' -import { BigNumber, Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { ethers } from 'hardhat' +import { Contract, Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthVault, IKeeperRewards, Keeper, OsToken } from '../typechain-types' import { ThenArg } from '../helpers/types' import { ethVaultFixture } from './shared/fixtures' @@ -15,30 +15,23 @@ import { import { increaseTime, setBalance } from './shared/utils' import snapshotGasCost from './shared/snapshotGasCost' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVault - liquidate', () => { - const shares = parseEther('32') - const osTokenShares = parseEther('28.8') - const penalty = parseEther('-2.6') - const unlockedMevReward = parseEther('0') + const shares = ethers.parseEther('32') + const osTokenShares = ethers.parseEther('28.8') + const penalty = ethers.parseEther('-2.6') + const unlockedMevReward = ethers.parseEther('0') const vaultParams = { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', } let owner: Wallet, admin: Wallet, dao: Wallet, liquidator: Wallet, receiver: Wallet let vault: EthVault, keeper: Keeper, osToken: OsToken, validatorsRegistry: Contract - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] - before('create fixture loader', async () => { - ;[owner, liquidator, dao, admin, receiver] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) - beforeEach('deploy fixture', async () => { + ;[dao, owner, liquidator, admin, receiver] = await (ethers as any).getSigners() ;({ createEthVault: createVault, keeper, @@ -61,7 +54,7 @@ describe('EthVault - liquidate', () => { // slashing received const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: penalty, unlockedMevReward }], + [{ vault: await vault.getAddress(), reward: penalty, unlockedMevReward }], 0 ) const harvestParams = { @@ -69,7 +62,7 @@ describe('EthVault - liquidate', () => { reward: penalty, unlockedMevReward: unlockedMevReward, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), unlockedMevReward: unlockedMevReward, reward: penalty, }), @@ -81,68 +74,76 @@ describe('EthVault - liquidate', () => { it('cannot liquidate osTokens to zero receiver', async () => { await expect( vault.connect(liquidator).liquidateOsToken(osTokenShares, owner.address, ZERO_ADDRESS) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) it('cannot liquidate osTokens from not harvested vault', async () => { await updateRewards(keeper, [ - { vault: vault.address, reward: parseEther('1'), unlockedMevReward: parseEther('0') }, + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1'), + unlockedMevReward: ethers.parseEther('0'), + }, ]) await updateRewards(keeper, [ - { vault: vault.address, reward: parseEther('1.2'), unlockedMevReward: parseEther('0') }, + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1.2'), + unlockedMevReward: ethers.parseEther('0'), + }, ]) await expect( vault.connect(liquidator).liquidateOsToken(osTokenShares, owner.address, receiver.address) - ).to.be.revertedWith('NotHarvested') + ).to.be.revertedWithCustomError(vault, 'NotHarvested') }) it('cannot liquidate osTokens for position with zero minted shares', async () => { await expect( vault.connect(liquidator).liquidateOsToken(osTokenShares, dao.address, receiver.address) - ).to.be.revertedWith('InvalidPosition') + ).to.be.revertedWithCustomError(vault, 'InvalidPosition') }) it('cannot liquidate osTokens when received assets exceed deposited assets', async () => { await expect( - vault.connect(liquidator).liquidateOsToken(shares.add(1), owner.address, receiver.address) - ).to.be.revertedWith('InvalidReceivedAssets') + vault.connect(liquidator).liquidateOsToken(shares + 1n, owner.address, receiver.address) + ).to.be.revertedWithCustomError(vault, 'InvalidReceivedAssets') }) it('cannot liquidate osTokens when withdrawable assets exceed received assets', async () => { - await setBalance(vault.address, BigNumber.from(0)) + await setBalance(await vault.getAddress(), 0n) await expect( vault.connect(liquidator).liquidateOsToken(osTokenShares, owner.address, receiver.address) - ).to.be.revertedWith('InvalidReceivedAssets') + ).to.be.revertedWithCustomError(vault, 'InvalidReceivedAssets') }) it('cannot liquidate osTokens when liquidating more than minted', async () => { await expect( vault .connect(liquidator) - .liquidateOsToken(osTokenShares.add(1), owner.address, receiver.address) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + .liquidateOsToken(osTokenShares + 1n, owner.address, receiver.address) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('cannot liquidate osTokens when health factor is above 1', async () => { await osToken.connect(liquidator).transfer(owner.address, osTokenShares) - const liqShares = osTokenShares.div(2) + const liqShares = osTokenShares / 2n await vault.connect(owner).burnOsToken(liqShares) await expect( vault.connect(liquidator).liquidateOsToken(liqShares, owner.address, receiver.address) - ).to.be.revertedWith('InvalidHealthFactor') + ).to.be.revertedWithCustomError(vault, 'InvalidHealthFactor') }) it('cannot liquidate zero osToken shares', async () => { await expect( vault.connect(liquidator).liquidateOsToken(0, owner.address, receiver.address) - ).to.be.revertedWith('InvalidShares') + ).to.be.revertedWithCustomError(vault, 'InvalidShares') }) it('cannot liquidate without osTokens', async () => { await osToken.connect(liquidator).transfer(dao.address, osTokenShares) await expect( vault.connect(liquidator).liquidateOsToken(osTokenShares, owner.address, receiver.address) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('calculates liquidation correctly', async () => { @@ -150,8 +151,8 @@ describe('EthVault - liquidate', () => { expect(await vault.osTokenPositions(owner.address)).to.be.eq(osTokenShares) expect(await vault.getShares(owner.address)).to.be.eq(shares) - const balanceBefore = await waffle.provider.getBalance(receiver.address) - const osTokenAssets = osTokenShares.mul(OSTOKEN_LIQ_BONUS).div(10000) + const balanceBefore = await ethers.provider.getBalance(receiver.address) + const osTokenAssets = (osTokenShares * BigInt(OSTOKEN_LIQ_BONUS)) / 10000n const burnedShares = await vault.convertToShares(osTokenAssets) const receipt = await vault @@ -160,10 +161,8 @@ describe('EthVault - liquidate', () => { expect(await osToken.balanceOf(liquidator.address)).to.eq(0) expect(await vault.osTokenPositions(owner.address)).to.be.eq(0) - expect(await vault.getShares(owner.address)).to.be.eq(shares.sub(burnedShares)) - expect(await waffle.provider.getBalance(receiver.address)).to.eq( - balanceBefore.add(osTokenAssets) - ) + expect(await vault.getShares(owner.address)).to.be.eq(shares - burnedShares) + expect(await ethers.provider.getBalance(receiver.address)).to.eq(balanceBefore + osTokenAssets) await expect(receipt) .to.emit(vault, 'OsTokenLiquidated') @@ -173,22 +172,22 @@ describe('EthVault - liquidate', () => { .withArgs(liquidator.address, ZERO_ADDRESS, osTokenShares) await expect(receipt) .to.emit(osToken, 'Burn') - .withArgs(vault.address, liquidator.address, osTokenShares, osTokenShares) + .withArgs(await vault.getAddress(), liquidator.address, osTokenShares, osTokenShares) await snapshotGasCost(receipt) }) it('can liquidate', async () => { - const penalty = parseEther('-2.6001') + const penalty = ethers.parseEther('-2.6001') const tree = await updateRewards(keeper, [ - { vault: vault.address, reward: penalty, unlockedMevReward }, + { vault: await vault.getAddress(), reward: penalty, unlockedMevReward }, ]) const harvestParams: IKeeperRewards.HarvestParamsStruct = { rewardsRoot: tree.root, reward: penalty, unlockedMevReward: unlockedMevReward, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), unlockedMevReward: unlockedMevReward, reward: penalty, }), diff --git a/test/EthVault.mint.spec.ts b/test/EthVault.mint.spec.ts index 7a284884..560a6082 100644 --- a/test/EthVault.mint.spec.ts +++ b/test/EthVault.mint.spec.ts @@ -1,41 +1,34 @@ -import { ethers, waffle } from 'hardhat' -import { BigNumber, Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' -import { EthVault, Keeper, OsToken, UnknownVaultMock, VaultsRegistry } from '../typechain-types' +import { ethers } from 'hardhat' +import { Contract, Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { EthVault, Keeper, OsToken, VaultsRegistry } from '../typechain-types' import { ThenArg } from '../helpers/types' import snapshotGasCost from './shared/snapshotGasCost' -import { ethVaultFixture } from './shared/fixtures' +import { createUnknownVaultMock, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' import { ONE_DAY, ZERO_ADDRESS } from './shared/constants' import { collateralizeEthVault, updateRewards } from './shared/rewards' import { increaseTime } from './shared/utils' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVault - mint', () => { - const assets = parseEther('2') - const osTokenShares = parseEther('1') + const assets = ethers.parseEther('2') + const osTokenShares = ethers.parseEther('1') const vaultParams = { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', } - let sender: Wallet, receiver: Wallet, admin: Wallet, owner: Wallet + let dao: Wallet, sender: Wallet, receiver: Wallet, admin: Wallet let vault: EthVault, keeper: Keeper, vaultsRegistry: VaultsRegistry, osToken: OsToken, validatorsRegistry: Contract - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] - before('create fixture loader', async () => { - ;[sender, receiver, owner, admin] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) - }) - beforeEach('deploy fixture', async () => { + ;[dao, sender, receiver, admin] = await (ethers as any).getSigners() ;({ createEthVault: createVault, keeper, @@ -54,81 +47,84 @@ describe('EthVault - mint', () => { const notCollatVault = await createVault(admin, vaultParams, false) await expect( notCollatVault.connect(sender).mintOsToken(receiver.address, osTokenShares, ZERO_ADDRESS) - ).to.be.revertedWith('NotCollateralized') + ).to.be.revertedWithCustomError(vault, 'NotCollateralized') }) it('cannot mint osTokens from not harvested vault', async () => { await updateRewards(keeper, [ - { vault: vault.address, reward: parseEther('1'), unlockedMevReward: parseEther('0') }, + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1'), + unlockedMevReward: ethers.parseEther('0'), + }, ]) await updateRewards(keeper, [ - { vault: vault.address, reward: parseEther('1.2'), unlockedMevReward: parseEther('0') }, + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1.2'), + unlockedMevReward: ethers.parseEther('0'), + }, ]) await expect( vault.connect(sender).mintOsToken(receiver.address, osTokenShares, ZERO_ADDRESS) - ).to.be.revertedWith('NotHarvested') + ).to.be.revertedWithCustomError(vault, 'NotHarvested') }) it('cannot mint osTokens to zero address', async () => { await expect( vault.connect(sender).mintOsToken(ZERO_ADDRESS, osTokenShares, ZERO_ADDRESS) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) it('cannot mint zero osToken shares', async () => { await expect( vault.connect(sender).mintOsToken(receiver.address, 0, ZERO_ADDRESS) - ).to.be.revertedWith('InvalidShares') + ).to.be.revertedWithCustomError(vault, 'InvalidShares') }) it('cannot mint osTokens from unregistered vault', async () => { - const factory = await ethers.getContractFactory('UnknownVaultMock') - const unknownVault = (await factory.deploy( - osToken.address, - await vault.implementation() - )) as UnknownVaultMock + const unknownVault = await createUnknownVaultMock(osToken, await vault.implementation()) await expect( unknownVault.connect(sender).mintOsToken(receiver.address, osTokenShares) - ).to.be.revertedWith('AccessDenied') + ).to.be.revertedWithCustomError(vault, 'AccessDenied') }) it('cannot mint osTokens from vault with unsupported implementation', async () => { - const factory = await ethers.getContractFactory('UnknownVaultMock') - const unknownVault = (await factory.deploy(osToken.address, ZERO_ADDRESS)) as UnknownVaultMock - await vaultsRegistry.connect(owner).addVault(unknownVault.address) + const unknownVault = await createUnknownVaultMock(osToken, ZERO_ADDRESS) + await vaultsRegistry.connect(dao).addVault(await unknownVault.getAddress()) await expect( unknownVault.connect(sender).mintOsToken(receiver.address, osTokenShares) - ).to.be.revertedWith('AccessDenied') + ).to.be.revertedWithCustomError(vault, 'AccessDenied') }) it('cannot mint osTokens when it exceeds capacity', async () => { const osTokenAssets = await vault.convertToAssets(osTokenShares) - await osToken.connect(owner).setCapacity(osTokenAssets.sub(1)) + await osToken.connect(dao).setCapacity(osTokenAssets - 1n) await expect( vault.connect(sender).mintOsToken(receiver.address, osTokenShares, ZERO_ADDRESS) - ).to.be.revertedWith('CapacityExceeded') + ).to.be.revertedWithCustomError(vault, 'CapacityExceeded') }) it('cannot mint osTokens when LTV is violated', async () => { const shares = await vault.convertToAssets(assets) await expect( vault.connect(sender).mintOsToken(receiver.address, shares, ZERO_ADDRESS) - ).to.be.revertedWith('LowLtv') + ).to.be.revertedWithCustomError(vault, 'LowLtv') }) it('cannot enter exit queue when LTV is violated', async () => { await vault.connect(sender).mintOsToken(receiver.address, osTokenShares, ZERO_ADDRESS) - await expect(vault.connect(sender).enterExitQueue(assets, receiver.address)).to.be.revertedWith( - 'LowLtv' - ) + await expect( + vault.connect(sender).enterExitQueue(assets, receiver.address) + ).to.be.revertedWithCustomError(vault, 'LowLtv') }) it('updates position accumulated fee', async () => { const treasury = await osToken.treasury() let totalShares = osTokenShares let totalAssets = await vault.convertToAssets(osTokenShares) - let cumulativeFeePerShare = parseEther('1') - let treasuryShares = BigNumber.from(0) + let cumulativeFeePerShare = ethers.parseEther('1') + let treasuryShares = 0n let positionShares = osTokenShares let receiverShares = osTokenShares @@ -159,13 +155,13 @@ describe('EthVault - mint', () => { expect(await vault.osTokenPositions(sender.address)).to.be.above(positionShares) receipt = await vault.connect(sender).mintOsToken(receiver.address, 100, ZERO_ADDRESS) - receiverShares = receiverShares.add(100) + receiverShares = receiverShares + 100n expect(await osToken.balanceOf(treasury)).to.be.above(0) expect(await osToken.cumulativeFeePerShare()).to.be.above(cumulativeFeePerShare) cumulativeFeePerShare = await osToken.cumulativeFeePerShare() treasuryShares = await osToken.balanceOf(treasury) - positionShares = treasuryShares.add(receiverShares) + positionShares = treasuryShares + receiverShares totalShares = positionShares totalAssets = await osToken.convertToAssets(positionShares) await verify() @@ -190,7 +186,7 @@ describe('EthVault - mint', () => { .withArgs(ZERO_ADDRESS, receiver.address, osTokenShares) await expect(receipt) .to.emit(osToken, 'Mint') - .withArgs(vault.address, receiver.address, osTokenAssets, osTokenShares) + .withArgs(await vault.getAddress(), receiver.address, osTokenAssets, osTokenShares) await snapshotGasCost(receipt) }) diff --git a/test/EthVault.multicall.spec.ts b/test/EthVault.multicall.spec.ts index af3eb181..d0b42cc0 100644 --- a/test/EthVault.multicall.spec.ts +++ b/test/EthVault.multicall.spec.ts @@ -1,36 +1,41 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' -import { EthVault, IKeeperRewards, Keeper, MulticallMock, OwnMevEscrow } from '../typechain-types' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { + EthVault, + IKeeperRewards, + Keeper, + MulticallMock, + OwnMevEscrow__factory, +} from '../typechain-types' import { ThenArg } from '../helpers/types' import snapshotGasCost from './shared/snapshotGasCost' -import { ethVaultFixture } from './shared/fixtures' +import { createMulticallMock, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' -import { extractExitPositionTicket, increaseTime, setBalance } from './shared/utils' +import { + extractExitPositionTicket, + getBlockTimestamp, + getLatestBlockTimestamp, + increaseTime, + setBalance, +} from './shared/utils' import { collateralizeEthVault, getRewardsRootProof, updateRewards } from './shared/rewards' import { registerEthValidator } from './shared/validators' import { ONE_DAY } from './shared/constants' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVault - multicall', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const referrer = '0x' + '1'.repeat(40) const metadataIpfsHash = '/ipfs/QmanU2bk9VsJuxhBmvfgXaC44fXpcC8DNHNxPZKMpNXo37' - let sender: Wallet, admin: Wallet, dao: Wallet + let sender: Wallet, admin: Wallet let vault: EthVault, keeper: Keeper, validatorsRegistry: Contract - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] - before('create fixture loader', async () => { - ;[sender, admin, dao] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) - beforeEach('deploy fixture', async () => { + ;[sender, admin] = (await (ethers as any).getSigners()).slice(1, 3) ;({ createEthVault: createVault, keeper, @@ -48,31 +53,32 @@ describe('EthVault - multicall', () => { }) it('can update state and queue for exit', async () => { - const ownMevEscrow = await ethers.getContractFactory('OwnMevEscrow') - const mevEscrow = ownMevEscrow.attach(await vault.mevEscrow()) as OwnMevEscrow + const mevEscrow = OwnMevEscrow__factory.connect(await vault.mevEscrow(), sender) // collateralize vault - await vault.connect(sender).deposit(sender.address, referrer, { value: parseEther('32') }) + await vault + .connect(sender) + .deposit(sender.address, referrer, { value: ethers.parseEther('32') }) await registerEthValidator(vault, keeper, validatorsRegistry, admin) - await setBalance(mevEscrow.address, parseEther('10')) + await setBalance(await mevEscrow.getAddress(), ethers.parseEther('10')) const userShares = await vault.getShares(sender.address) // update rewards root for the vault - const vaultReward = parseEther('1') + const vaultReward = ethers.parseEther('1') const tree = await updateRewards(keeper, [ - { reward: vaultReward, unlockedMevReward: 0, vault: vault.address }, + { reward: vaultReward, unlockedMevReward: 0n, vault: await vault.getAddress() }, ]) // retrieve redeemable shares after state update const harvestParams: IKeeperRewards.HarvestParamsStruct = { rewardsRoot: tree.root, reward: vaultReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward: vaultReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, }), } @@ -81,7 +87,7 @@ describe('EthVault - multicall', () => { vault.interface.encodeFunctionData('updateState', [harvestParams]), vault.interface.encodeFunctionData('convertToAssets', [userShares]), ] - let result = await vault.callStatic.multicall(calls) + let result = await vault.multicall.staticCall(calls) const userAssets = vault.interface.decodeFunctionResult('convertToAssets', result[1])[0] // convert exit queue assets to shares @@ -89,7 +95,7 @@ describe('EthVault - multicall', () => { vault.interface.encodeFunctionData('updateState', [harvestParams]), vault.interface.encodeFunctionData('convertToShares', [userAssets]), ] - result = await vault.callStatic.multicall(calls) + result = await vault.multicall.staticCall(calls) const exitQueueShares = vault.interface.decodeFunctionResult('convertToShares', result[1])[0] calls = [vault.interface.encodeFunctionData('updateState', [harvestParams])] @@ -100,29 +106,29 @@ describe('EthVault - multicall', () => { ) await updateRewards(keeper, [ - { reward: vaultReward, unlockedMevReward: 0, vault: vault.address }, + { reward: vaultReward, unlockedMevReward: 0n, vault: await vault.getAddress() }, ]) let receipt = await vault.connect(sender).multicall(calls) - const queueTicket = extractExitPositionTicket(await receipt.wait()) - const timestamp = (await ethers.provider.getBlock((await receipt.wait()).blockNumber)).timestamp + const queueTicket = await extractExitPositionTicket(receipt) + const timestamp = await getBlockTimestamp(receipt) await expect(receipt).to.emit(keeper, 'Harvested') await expect(receipt).to.emit(mevEscrow, 'Harvested') await expect(receipt).to.emit(vault, 'ExitQueueEntered') await snapshotGasCost(receipt) // wait for exit queue to complete and withdraw exited assets - await setBalance(vault.address, userAssets) + await setBalance(await vault.getAddress(), userAssets) // wait for exit queue await increaseTime(ONE_DAY) await updateRewards(keeper, [ - { reward: vaultReward, unlockedMevReward: 0, vault: vault.address }, + { reward: vaultReward, unlockedMevReward: 0n, vault: await vault.getAddress() }, ]) calls = [vault.interface.encodeFunctionData('updateState', [harvestParams])] calls.push(vault.interface.encodeFunctionData('getExitQueueIndex', [queueTicket])) - result = await vault.connect(sender).callStatic.multicall(calls) + result = await vault.connect(sender).multicall.staticCall(calls) const checkpointIndex = vault.interface.decodeFunctionResult('getExitQueueIndex', result[1])[0] calls = [vault.interface.encodeFunctionData('updateState', [harvestParams])] @@ -137,7 +143,7 @@ describe('EthVault - multicall', () => { receipt = await vault.connect(sender).multicall(calls) await expect(receipt) .to.emit(vault, 'ExitedAssetsClaimed') - .withArgs(sender.address, queueTicket, 0, userAssets.sub(1)) // 1 wei is left in the vault + .withArgs(sender.address, queueTicket, 0, userAssets - 1n) // 1 wei is left in the vault await snapshotGasCost(receipt) }) @@ -152,64 +158,63 @@ describe('EthVault - multicall', () => { let multicallMock: MulticallMock beforeEach(async () => { - const multicallMockFactory = await ethers.getContractFactory('MulticallMock') - multicallMock = (await multicallMockFactory.deploy()) as MulticallMock + multicallMock = await createMulticallMock() }) it('fails to deposit, enter exit queue, update state and claim in one transaction', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) expect(await vault.isStateUpdateRequired()).to.eq(false) - expect(await keeper.canHarvest(vault.address)).to.eq(false) + expect(await keeper.canHarvest(await vault.getAddress())).to.eq(false) - const vaultReward = parseEther('1') + const vaultReward = ethers.parseEther('1') const tree = await updateRewards(keeper, [ - { reward: vaultReward, unlockedMevReward: 0, vault: vault.address }, + { reward: vaultReward, unlockedMevReward: 0n, vault: await vault.getAddress() }, ]) - await setBalance(await vault.mevEscrow(), parseEther('1')) + await setBalance(await vault.mevEscrow(), ethers.parseEther('1')) expect(await vault.isStateUpdateRequired()).to.eq(false) - expect(await keeper.canHarvest(vault.address)).to.eq(true) + expect(await keeper.canHarvest(await vault.getAddress())).to.eq(true) const harvestParams: IKeeperRewards.HarvestParamsStruct = { rewardsRoot: tree.root, reward: vaultReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward: vaultReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, }), } - const amount = parseEther('1') - const currentBlockTimestamp = (await ethers.provider.getBlock('latest')).timestamp - await waffle.provider.send('evm_setNextBlockTimestamp', [currentBlockTimestamp + 1]) + const amount = ethers.parseEther('1') + const currentBlockTimestamp = await getLatestBlockTimestamp() + await ethers.provider.send('evm_setNextBlockTimestamp', [currentBlockTimestamp + 1]) const calls = [ { - target: vault.address, + target: await vault.getAddress(), isPayable: true, callData: vault.interface.encodeFunctionData('deposit', [ - multicallMock.address, + await multicallMock.getAddress(), referrer, ]), }, { - target: vault.address, + target: await vault.getAddress(), isPayable: false, callData: vault.interface.encodeFunctionData('enterExitQueue', [ amount, - multicallMock.address, + await multicallMock.getAddress(), ]), }, { - target: vault.address, + target: await vault.getAddress(), isPayable: false, callData: vault.interface.encodeFunctionData('updateState', [harvestParams]), }, { - target: vault.address, + target: await vault.getAddress(), isPayable: false, callData: vault.interface.encodeFunctionData('claimExitedAssets', [ - parseEther('32'), + ethers.parseEther('32'), currentBlockTimestamp + 1, 1, ]), diff --git a/test/EthVault.redeem.spec.ts b/test/EthVault.redeem.spec.ts index 518f624c..8088226f 100644 --- a/test/EthVault.redeem.spec.ts +++ b/test/EthVault.redeem.spec.ts @@ -1,7 +1,7 @@ -import { ethers, waffle } from 'hardhat' -import { BigNumber, Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' -import { EthVault, Keeper, OsToken, IKeeperRewards } from '../typechain-types' +import { ethers } from 'hardhat' +import { Contract, Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { EthVault, IKeeperRewards, Keeper, OsToken } from '../typechain-types' import { ThenArg } from '../helpers/types' import { ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' @@ -15,31 +15,24 @@ import { import { increaseTime, setBalance } from './shared/utils' import snapshotGasCost from './shared/snapshotGasCost' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVault - redeem osToken', () => { - const shares = parseEther('32') - const osTokenShares = parseEther('28.8') - const penalty = parseEther('-0.53') - const unlockedMevReward = parseEther('0') - const redeemedShares = parseEther('4.76') + const shares = ethers.parseEther('32') + const osTokenShares = ethers.parseEther('28.8') + const penalty = ethers.parseEther('-0.53') + const unlockedMevReward = ethers.parseEther('0') + const redeemedShares = ethers.parseEther('4.76') const vaultParams = { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', } let owner: Wallet, admin: Wallet, dao: Wallet, redeemer: Wallet, receiver: Wallet let vault: EthVault, keeper: Keeper, osToken: OsToken, validatorsRegistry: Contract - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] - before('create fixture loader', async () => { - ;[owner, redeemer, dao, admin, receiver] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) - beforeEach('deploy fixture', async () => { + ;[dao, owner, redeemer, admin, receiver] = await (ethers as any).getSigners() ;({ createEthVault: createVault, keeper, @@ -59,7 +52,7 @@ describe('EthVault - redeem osToken', () => { // penalty received const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: penalty, unlockedMevReward }], + [{ vault: await vault.getAddress(), reward: penalty, unlockedMevReward }], 0 ) const harvestParams: IKeeperRewards.HarvestParamsStruct = { @@ -67,7 +60,7 @@ describe('EthVault - redeem osToken', () => { reward: penalty, unlockedMevReward: unlockedMevReward, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), unlockedMevReward: unlockedMevReward, reward: penalty, }), @@ -79,38 +72,46 @@ describe('EthVault - redeem osToken', () => { it('cannot redeem osTokens to zero receiver', async () => { await expect( vault.connect(redeemer).redeemOsToken(redeemedShares, owner.address, ZERO_ADDRESS) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) it('cannot redeem osTokens from not harvested vault', async () => { await updateRewards(keeper, [ - { vault: vault.address, reward: parseEther('1'), unlockedMevReward: parseEther('0') }, + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1'), + unlockedMevReward: ethers.parseEther('0'), + }, ]) await updateRewards(keeper, [ - { vault: vault.address, reward: parseEther('1.2'), unlockedMevReward: parseEther('0') }, + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1.2'), + unlockedMevReward: ethers.parseEther('0'), + }, ]) await expect( vault.connect(redeemer).redeemOsToken(redeemedShares, owner.address, receiver.address) - ).to.be.revertedWith('NotHarvested') + ).to.be.revertedWithCustomError(vault, 'NotHarvested') }) it('cannot redeem osTokens for position with zero minted shares', async () => { await expect( vault.connect(redeemer).redeemOsToken(redeemedShares, dao.address, receiver.address) - ).to.be.revertedWith('InvalidPosition') + ).to.be.revertedWithCustomError(vault, 'InvalidPosition') }) it('cannot redeem osTokens when withdrawable assets exceed received assets', async () => { - await setBalance(vault.address, BigNumber.from(0)) + await setBalance(await vault.getAddress(), 0n) await expect( vault.connect(redeemer).redeemOsToken(redeemedShares, owner.address, receiver.address) - ).to.be.revertedWith('InvalidReceivedAssets') + ).to.be.revertedWithCustomError(vault, 'InvalidReceivedAssets') }) it('cannot redeem osTokens when redeeming more than minted', async () => { await expect( - vault.connect(redeemer).redeemOsToken(osTokenShares.add(1), owner.address, receiver.address) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + vault.connect(redeemer).redeemOsToken(osTokenShares + 1n, owner.address, receiver.address) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('cannot redeem osTokens when LTV is below redeemFromLtvPercent', async () => { @@ -118,28 +119,28 @@ describe('EthVault - redeem osToken', () => { await vault.connect(owner).burnOsToken(redeemedShares) await expect( vault.connect(redeemer).redeemOsToken(redeemedShares, owner.address, receiver.address) - ).to.be.revertedWith('InvalidLtv') + ).to.be.revertedWithCustomError(vault, 'InvalidLtv') }) it('cannot redeem osTokens when LTV is below redeemToLtvPercent', async () => { await expect( vault .connect(redeemer) - .redeemOsToken(redeemedShares.add(parseEther('0.01')), owner.address, receiver.address) - ).to.be.revertedWith('RedemptionExceeded') + .redeemOsToken(redeemedShares + ethers.parseEther('0.01'), owner.address, receiver.address) + ).to.be.revertedWithCustomError(vault, 'RedemptionExceeded') }) it('cannot redeem zero osToken shares', async () => { await expect( vault.connect(redeemer).redeemOsToken(0, owner.address, receiver.address) - ).to.be.revertedWith('InvalidShares') + ).to.be.revertedWithCustomError(vault, 'InvalidShares') }) it('cannot redeem without osTokens', async () => { await osToken.connect(redeemer).transfer(dao.address, osTokenShares) await expect( vault.connect(redeemer).redeemOsToken(osTokenShares, owner.address, receiver.address) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('calculates redeem correctly', async () => { @@ -147,7 +148,7 @@ describe('EthVault - redeem osToken', () => { expect(await vault.osTokenPositions(owner.address)).to.be.eq(osTokenShares) expect(await vault.getShares(owner.address)).to.be.eq(shares) - const balanceBefore = await waffle.provider.getBalance(receiver.address) + const balanceBefore = await ethers.provider.getBalance(receiver.address) const redeemedAssets = await osToken.convertToAssets(redeemedShares) const burnedShares = await vault.convertToShares(redeemedAssets) @@ -155,12 +156,10 @@ describe('EthVault - redeem osToken', () => { .connect(redeemer) .redeemOsToken(redeemedShares, owner.address, receiver.address) - expect(await osToken.balanceOf(redeemer.address)).to.eq(osTokenShares.sub(redeemedShares)) - expect(await vault.osTokenPositions(owner.address)).to.be.eq(osTokenShares.sub(redeemedShares)) - expect(await vault.getShares(owner.address)).to.be.eq(shares.sub(burnedShares)) - expect(await waffle.provider.getBalance(receiver.address)).to.eq( - balanceBefore.add(redeemedAssets) - ) + expect(await osToken.balanceOf(redeemer.address)).to.eq(osTokenShares - redeemedShares) + expect(await vault.osTokenPositions(owner.address)).to.be.eq(osTokenShares - redeemedShares) + expect(await vault.getShares(owner.address)).to.be.eq(shares - burnedShares) + expect(await ethers.provider.getBalance(receiver.address)).to.eq(balanceBefore + redeemedAssets) await expect(receipt) .to.emit(vault, 'OsTokenRedeemed') @@ -170,22 +169,22 @@ describe('EthVault - redeem osToken', () => { .withArgs(redeemer.address, ZERO_ADDRESS, redeemedShares) await expect(receipt) .to.emit(osToken, 'Burn') - .withArgs(vault.address, redeemer.address, redeemedShares, redeemedAssets) + .withArgs(await vault.getAddress(), redeemer.address, redeemedShares, redeemedAssets) await snapshotGasCost(receipt) }) it('can redeem', async () => { - const penalty = parseEther('-0.530001') + const penalty = ethers.parseEther('-0.530001') const tree = await updateRewards(keeper, [ - { vault: vault.address, reward: penalty, unlockedMevReward }, + { vault: await vault.getAddress(), reward: penalty, unlockedMevReward }, ]) const harvestParams: IKeeperRewards.HarvestParamsStruct = { rewardsRoot: tree.root, reward: penalty, unlockedMevReward: unlockedMevReward, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), unlockedMevReward: unlockedMevReward, reward: penalty, }), diff --git a/test/EthVault.register.spec.ts b/test/EthVault.register.spec.ts index 240b3880..367a1334 100644 --- a/test/EthVault.register.spec.ts +++ b/test/EthVault.register.spec.ts @@ -1,12 +1,12 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Contract, Wallet } from 'ethers' -import { hexlify, parseEther } from 'ethers/lib/utils' import { UintNumberType } from '@chainsafe/ssz' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { ThenArg } from '../helpers/types' import { EthVault, IKeeperValidators, Keeper } from '../typechain-types' import snapshotGasCost from './shared/snapshotGasCost' import { expect } from './shared/expect' -import { setBalance } from './shared/utils' +import { setBalance, toHexString } from './shared/utils' import { appendDepositData, createEthValidatorsData, @@ -27,28 +27,25 @@ import { ZERO_ADDRESS, } from './shared/constants' -const createFixtureLoader = waffle.createFixtureLoader -const gwei = 1000000000 +const gwei = 1000000000n const uintSerializer = new UintNumberType(8) describe('EthVault - register', () => { - const validatorDeposit = parseEther('32') + const validatorDeposit = ethers.parseEther('32') const capacity = MAX_UINT256 const feePercent = 1000 const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' const deadline = VALIDATORS_DEADLINE - let admin: Wallet, dao: Wallet, other: Wallet + let admin: Wallet, other: Wallet let vault: EthVault, keeper: Keeper, validatorsRegistry: Contract let validatorsData: EthValidatorsData let validatorsRegistryRoot: string - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] before('create fixture loader', async () => { - ;[admin, dao, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) + ;[admin, other] = (await (ethers as any).getSigners()).slice(1, 3) }) beforeEach('deploy fixture', async () => { @@ -79,7 +76,7 @@ describe('EthVault - register', () => { proof = getValidatorProof(validatorsData.tree, validator, 0) const exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] const signatures = getOraclesSignatures( - getEthValidatorsSigningData( + await getEthValidatorsSigningData( validator, deadline, exitSignaturesIpfsHash, @@ -99,30 +96,35 @@ describe('EthVault - register', () => { }) it('fails with not enough withdrawable assets', async () => { - await setBalance(vault.address, parseEther('31.9')) - await expect(vault.registerValidator(approvalParams, proof)).to.be.revertedWith( + await setBalance(await vault.getAddress(), ethers.parseEther('31.9')) + await expect(vault.registerValidator(approvalParams, proof)).to.be.revertedWithCustomError( + vault, 'InsufficientAssets' ) }) it('fails with invalid proof', async () => { const invalidProof = getValidatorProof(validatorsData.tree, validatorsData.validators[1], 1) - await expect(vault.registerValidator(approvalParams, invalidProof)).to.be.revertedWith( - 'InvalidProof' - ) + await expect( + vault.registerValidator(approvalParams, invalidProof) + ).to.be.revertedWithCustomError(vault, 'InvalidProof') }) it('fails with invalid validator length', async () => { - const invalidValidator = appendDepositData(validator, validatorDeposit, vault.address) + const invalidValidator = appendDepositData( + validator, + validatorDeposit, + await vault.getAddress() + ) const exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] await expect( vault.registerValidator( { validatorsRegistryRoot, - validators: appendDepositData(validator, validatorDeposit, vault.address), + validators: appendDepositData(validator, validatorDeposit, await vault.getAddress()), deadline, signatures: getOraclesSignatures( - getEthValidatorsSigningData( + await getEthValidatorsSigningData( invalidValidator, deadline, exitSignaturesIpfsHash, @@ -136,21 +138,21 @@ describe('EthVault - register', () => { }, proof ) - ).to.be.revertedWith('InvalidValidator') + ).to.be.revertedWithCustomError(vault, 'InvalidValidator') }) it('succeeds', async () => { const receipt = await vault.registerValidator(approvalParams, proof) - const publicKey = hexlify(validator.subarray(0, 48)) + const publicKey = `0x${validator.subarray(0, 48).toString('hex')}` await expect(receipt).to.emit(vault, 'ValidatorRegistered').withArgs(publicKey) await expect(receipt) .to.emit(validatorsRegistry, 'DepositEvent') .withArgs( publicKey, - hexlify(getWithdrawalCredentials(vault.address)), - hexlify(uintSerializer.serialize(validatorDeposit.div(gwei).toNumber())), - hexlify(validator.subarray(48, 144)), - hexlify(uintSerializer.serialize(0)) + toHexString(getWithdrawalCredentials(await vault.getAddress())), + toHexString(Buffer.from(uintSerializer.serialize(Number(validatorDeposit / gwei)))), + toHexString(validator.subarray(48, 144)), + toHexString(Buffer.from(uintSerializer.serialize(0))) ) await snapshotGasCost(receipt) }) @@ -171,9 +173,9 @@ describe('EthVault - register', () => { const exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] const sortedVals = multiProof.leaves.map((v) => v[0]) indexes = validators.map((v) => sortedVals.indexOf(v)) - await setBalance(vault.address, validatorDeposit.mul(validators.length)) + await setBalance(await vault.getAddress(), validatorDeposit * BigInt(validators.length)) signatures = getOraclesSignatures( - getEthValidatorsSigningData( + await getEthValidatorsSigningData( Buffer.concat(validators), deadline, exitSignaturesIpfsHash, @@ -193,10 +195,10 @@ describe('EthVault - register', () => { }) it('fails with not enough withdrawable assets', async () => { - await setBalance(vault.address, validatorDeposit.mul(validators.length - 1)) + await setBalance(await vault.getAddress(), validatorDeposit * BigInt(validators.length - 1)) await expect( vault.registerValidators(approvalParams, indexes, multiProof.proofFlags, multiProof.proof) - ).to.be.revertedWith('InsufficientAssets') + ).to.be.revertedWithCustomError(vault, 'InsufficientAssets') }) it('fails with invalid validators count', async () => { @@ -208,7 +210,7 @@ describe('EthVault - register', () => { validators: Buffer.from(''), deadline, signatures: getOraclesSignatures( - getEthValidatorsSigningData( + await getEthValidatorsSigningData( Buffer.from(''), deadline, exitSignaturesIpfsHash, @@ -224,14 +226,14 @@ describe('EthVault - register', () => { multiProof.proofFlags, multiProof.proof ) - ).to.be.revertedWith('InvalidValidators') + ).to.be.revertedWithCustomError(vault, 'InvalidValidators') }) it('fails with invalid deposit data root', async () => { const invalidRoot = appendDepositData( validators[1].subarray(0, 144), validatorDeposit, - vault.address + await vault.getAddress() ).subarray(144, 176) const invalidValidators = [ Buffer.concat([validators[0].subarray(0, 144), invalidRoot]), @@ -246,7 +248,7 @@ describe('EthVault - register', () => { deadline, validators: invalidValidatorsConcat, signatures: getOraclesSignatures( - getEthValidatorsSigningData( + await getEthValidatorsSigningData( invalidValidatorsConcat, deadline, exitSignaturesIpfsHash, @@ -269,7 +271,11 @@ describe('EthVault - register', () => { it('fails with invalid deposit amount', async () => { const invalidValidators = [ - appendDepositData(validators[0].subarray(0, 144), parseEther('1'), vault.address), + appendDepositData( + validators[0].subarray(0, 144), + ethers.parseEther('1'), + await vault.getAddress() + ), ...validators.slice(1), ] const invalidValidatorsConcat = Buffer.concat(invalidValidators) @@ -281,7 +287,7 @@ describe('EthVault - register', () => { validators: invalidValidatorsConcat, deadline, signatures: getOraclesSignatures( - getEthValidatorsSigningData( + await getEthValidatorsSigningData( invalidValidatorsConcat, deadline, exitSignaturesIpfsHash, @@ -304,7 +310,11 @@ describe('EthVault - register', () => { it('fails with invalid withdrawal credentials', async () => { const invalidValidators = [ - appendDepositData(validators[0].subarray(0, 144), parseEther('1'), keeper.address), + appendDepositData( + validators[0].subarray(0, 144), + ethers.parseEther('1'), + await keeper.getAddress() + ), ...validators.slice(1), ] const invalidValidatorsConcat = Buffer.concat(invalidValidators) @@ -316,7 +326,7 @@ describe('EthVault - register', () => { validators: invalidValidatorsConcat, deadline, signatures: getOraclesSignatures( - getEthValidatorsSigningData( + await getEthValidatorsSigningData( invalidValidatorsConcat, deadline, exitSignaturesIpfsHash, @@ -357,7 +367,7 @@ describe('EthVault - register', () => { it('fails with invalid indexes', async () => { await expect( vault.registerValidators(approvalParams, [], multiProof.proofFlags, multiProof.proof) - ).to.be.revertedWith('InvalidValidators') + ).to.be.revertedWithCustomError(vault, 'InvalidValidators') await expect( vault.registerValidators( @@ -366,7 +376,7 @@ describe('EthVault - register', () => { multiProof.proofFlags, multiProof.proof ) - ).to.be.revertedWith(PANIC_CODES.OUT_OF_BOUND_INDEX) + ).to.be.revertedWithPanic(PANIC_CODES.OUT_OF_BOUND_INDEX) await expect( vault.registerValidators( @@ -375,7 +385,7 @@ describe('EthVault - register', () => { multiProof.proofFlags, multiProof.proof ) - ).to.be.revertedWith('InvalidValidators') + ).to.be.revertedWithCustomError(vault, 'InvalidValidators') await expect( vault.registerValidators( @@ -384,7 +394,7 @@ describe('EthVault - register', () => { multiProof.proofFlags, multiProof.proof ) - ).to.be.revertedWith('InvalidProof') + ).to.be.revertedWithCustomError(vault, 'InvalidProof') }) it('fails with invalid validator length', async () => { @@ -402,7 +412,7 @@ describe('EthVault - register', () => { validators: invalidValidators[i], deadline, signatures: getOraclesSignatures( - getEthValidatorsSigningData( + await getEthValidatorsSigningData( invalidValidators[i], deadline, exitSignaturesIpfsHash, @@ -418,7 +428,7 @@ describe('EthVault - register', () => { multiProof.proofFlags, multiProof.proof ) - ).to.be.revertedWith('InvalidValidators') + ).to.be.revertedWithCustomError(vault, 'InvalidValidators') } }) @@ -431,16 +441,16 @@ describe('EthVault - register', () => { ) for (let i = 0; i < validators.length; i++) { const validator = validators[i] - const publicKey = hexlify(validator.subarray(0, 48)) + const publicKey = toHexString(validator.subarray(0, 48)) await expect(receipt).to.emit(vault, 'ValidatorRegistered').withArgs(publicKey) await expect(receipt) .to.emit(validatorsRegistry, 'DepositEvent') .withArgs( publicKey, - hexlify(getWithdrawalCredentials(vault.address)), - hexlify(uintSerializer.serialize(validatorDeposit.div(gwei).toNumber())), - hexlify(validator.subarray(48, 144)), - hexlify(uintSerializer.serialize(i)) + toHexString(getWithdrawalCredentials(await vault.getAddress())), + toHexString(Buffer.from(uintSerializer.serialize(Number(validatorDeposit / gwei)))), + toHexString(validator.subarray(48, 144)), + toHexString(Buffer.from(uintSerializer.serialize(i))) ) } await snapshotGasCost(receipt) diff --git a/test/EthVault.settings.spec.ts b/test/EthVault.settings.spec.ts index f793b03a..89e650da 100644 --- a/test/EthVault.settings.spec.ts +++ b/test/EthVault.settings.spec.ts @@ -1,29 +1,26 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' -import { Keeper, EthVault } from '../typechain-types' + +import { EthVault, Keeper } from '../typechain-types' import { ThenArg } from '../helpers/types' import { ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' import snapshotGasCost from './shared/snapshotGasCost' import { ZERO_ADDRESS } from './shared/constants' import { collateralizeEthVault, updateRewards } from './shared/rewards' - -const createFixtureLoader = waffle.createFixtureLoader +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' describe('EthVault - settings', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] - let admin: Wallet, owner: Wallet, keysManager: Wallet, other: Wallet, newFeeRecipient: Wallet + let admin: Wallet, keysManager: Wallet, other: Wallet, newFeeRecipient: Wallet let keeper: Keeper, validatorsRegistry: Contract before('create fixture loader', async () => { - ;[admin, owner, keysManager, other, newFeeRecipient] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) + ;[admin, keysManager, other, newFeeRecipient] = (await (ethers as any).getSigners()).slice(1, 5) }) beforeEach('deploy fixture', async () => { @@ -36,13 +33,18 @@ describe('EthVault - settings', () => { describe('fee percent', () => { it('cannot be set to invalid value', async () => { + const vault = await createVault(admin, { + capacity, + feePercent: 10000, + metadataIpfsHash, + }) await expect( createVault(admin, { capacity, feePercent: 10001, metadataIpfsHash, }) - ).to.be.revertedWith('InvalidFeePercent') + ).to.be.revertedWithCustomError(vault, 'InvalidFeePercent') }) }) @@ -60,9 +62,9 @@ describe('EthVault - settings', () => { }) it('onlykeys manager can update', async () => { - await expect(vault.connect(admin).setValidatorsRoot(newValidatorsRoot)).to.be.revertedWith( - 'AccessDenied' - ) + await expect( + vault.connect(admin).setValidatorsRoot(newValidatorsRoot) + ).to.be.revertedWithCustomError(vault, 'AccessDenied') }) it('can update', async () => { @@ -86,13 +88,14 @@ describe('EthVault - settings', () => { }) it('cannot be updated by anyone', async () => { - await expect(vault.connect(other).setKeysManager(keysManager.address)).to.be.revertedWith( - 'AccessDenied' - ) + await expect( + vault.connect(other).setKeysManager(keysManager.address) + ).to.be.revertedWithCustomError(vault, 'AccessDenied') }) it('cannot set to zero address', async () => { - await expect(vault.connect(admin).setKeysManager(ZERO_ADDRESS)).to.be.revertedWith( + await expect(vault.connect(admin).setKeysManager(ZERO_ADDRESS)).to.be.revertedWithCustomError( + vault, 'ZeroAddress' ) }) @@ -124,21 +127,25 @@ describe('EthVault - settings', () => { it('only admin can update', async () => { await expect( vault.connect(other).setFeeRecipient(newFeeRecipient.address) - ).to.be.revertedWith('AccessDenied') + ).to.be.revertedWithCustomError(vault, 'AccessDenied') }) it('cannot set to zero address', async () => { - await expect(vault.connect(admin).setFeeRecipient(ZERO_ADDRESS)).to.be.revertedWith( - 'InvalidFeeRecipient' - ) + await expect( + vault.connect(admin).setFeeRecipient(ZERO_ADDRESS) + ).to.be.revertedWithCustomError(vault, 'InvalidFeeRecipient') }) it('cannot update when not harvested', async () => { - await updateRewards(keeper, [{ vault: vault.address, reward: 1, unlockedMevReward: 0 }]) - await updateRewards(keeper, [{ vault: vault.address, reward: 2, unlockedMevReward: 0 }]) + await updateRewards(keeper, [ + { vault: await vault.getAddress(), reward: 1n, unlockedMevReward: 0n }, + ]) + await updateRewards(keeper, [ + { vault: await vault.getAddress(), reward: 2n, unlockedMevReward: 0n }, + ]) await expect( vault.connect(admin).setFeeRecipient(newFeeRecipient.address) - ).to.be.revertedWith('NotHarvested') + ).to.be.revertedWithCustomError(vault, 'NotHarvested') }) it('can update', async () => { @@ -165,9 +172,9 @@ describe('EthVault - settings', () => { }) it('only admin can update', async () => { - await expect(vault.connect(other).setMetadata(newMetadataIpfsHash)).to.be.revertedWith( - 'AccessDenied' - ) + await expect( + vault.connect(other).setMetadata(newMetadataIpfsHash) + ).to.be.revertedWithCustomError(vault, 'AccessDenied') const receipt = await vault.connect(admin).setMetadata(newMetadataIpfsHash) await expect(receipt) .to.emit(vault, 'MetadataUpdated') diff --git a/test/EthVault.state.spec.ts b/test/EthVault.state.spec.ts index e4e6e325..1793d32f 100644 --- a/test/EthVault.state.spec.ts +++ b/test/EthVault.state.spec.ts @@ -1,7 +1,7 @@ -import { ethers, waffle } from 'hardhat' -import { BigNumber, Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' -import { EthVault, Keeper, OwnMevEscrow, SharedMevEscrow } from '../typechain-types' +import { ethers } from 'hardhat' +import { Contract, Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { EthVault, Keeper, SharedMevEscrow, OwnMevEscrow__factory } from '../typechain-types' import { ThenArg } from '../helpers/types' import snapshotGasCost from './shared/snapshotGasCost' import { ethVaultFixture } from './shared/fixtures' @@ -16,31 +16,24 @@ import { import { setBalance } from './shared/utils' import { collateralizeEthVault, getRewardsRootProof, updateRewards } from './shared/rewards' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVault - state', () => { - const holderAssets = parseEther('1') - const holderShares = parseEther('1') - const capacity = parseEther('1000') + const holderAssets = ethers.parseEther('1') + const holderShares = ethers.parseEther('1') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' - let holder: Wallet, admin: Wallet, dao: Wallet, other: Wallet + let holder: Wallet, admin: Wallet, other: Wallet let vault: EthVault, keeper: Keeper, sharedMevEscrow: SharedMevEscrow, validatorsRegistry: Contract - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] let createVaultMock: ThenArg>['createEthVaultMock'] - before('create fixture loader', async () => { - ;[holder, admin, dao, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) - beforeEach('deploy fixture', async () => { + ;[holder, admin, other] = (await (ethers as any).getSigners()).slice(1, 4) ;({ createEthVault: createVault, createEthVaultMock: createVaultMock, @@ -58,35 +51,39 @@ describe('EthVault - state', () => { it('does not fail with zero assets delta', async () => { const tree = await updateRewards(keeper, [ - { vault: vault.address, unlockedMevReward: 0, reward: 0 }, + { vault: await vault.getAddress(), unlockedMevReward: 0n, reward: 0n }, ]) const proof = getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, - reward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, + reward: 0n, }) const receipt = await vault.updateState({ rewardsRoot: tree.root, - reward: 0, - unlockedMevReward: 0, + reward: 0n, + unlockedMevReward: 0n, proof, }) - await expect(receipt).to.emit(keeper, 'Harvested').withArgs(vault.address, tree.root, 0, 0) + await expect(receipt) + .to.emit(keeper, 'Harvested') + .withArgs(await vault.getAddress(), tree.root, 0, 0) await expect(receipt).to.not.emit(sharedMevEscrow, 'Harvested') }) it('reverts when overflow', async () => { - const reward = BigNumber.from(2).pow(160).sub(1).div(2) - const unlockedMevReward = BigNumber.from(2).pow(160).sub(1) - const tree = await updateRewards(keeper, [{ vault: vault.address, reward, unlockedMevReward }]) - await setBalance(sharedMevEscrow.address, unlockedMevReward) + const reward = (2n ** 160n - 1n) / 2n + const unlockedMevReward = 2n ** 160n - 1n + const tree = await updateRewards(keeper, [ + { vault: await vault.getAddress(), reward, unlockedMevReward }, + ]) + await setBalance(await sharedMevEscrow.getAddress(), unlockedMevReward) await expect( vault.updateState({ rewardsRoot: tree.root, reward, unlockedMevReward, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward, unlockedMevReward, }), @@ -95,22 +92,22 @@ describe('EthVault - state', () => { }) it('reverts when underflow', async () => { - const reward = parseEther('-2') + const reward = ethers.parseEther('-2') const tree = await updateRewards(keeper, [ - { vault: vault.address, reward, unlockedMevReward: 0 }, + { vault: await vault.getAddress(), reward, unlockedMevReward: 0n }, ]) await expect( vault.updateState({ rewardsRoot: tree.root, reward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward, - unlockedMevReward: 0, + unlockedMevReward: 0n, }), }) - ).revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('is not affected by inflation attack', async () => { @@ -123,65 +120,68 @@ describe('EthVault - state', () => { }, true ) - const securityDeposit = BigNumber.from('1000000000') + const securityDeposit = 1000000000n await vault.connect(other).deposit(other.address, ZERO_ADDRESS, { value: 1 }) await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) await vault._setTotalAssets(1) expect(await vault.totalAssets()).to.eq(1) - expect(await vault.totalShares()).to.eq(securityDeposit.add(1)) + expect(await vault.totalShares()).to.eq(securityDeposit + 1n) // attacker drops a lot of eth as a reward - const burnedAssets = parseEther('1000') + const burnedAssets = ethers.parseEther('1000') await setBalance(await vault.mevEscrow(), burnedAssets) // state is updated const tree = await updateRewards(keeper, [ - { vault: vault.address, reward: 0, unlockedMevReward: 1 }, + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 1n }, ]) await vault.updateState({ rewardsRoot: tree.root, - reward: 0, - unlockedMevReward: 1, + reward: 0n, + unlockedMevReward: 1n, proof: getRewardsRootProof(tree, { - vault: vault.address, - reward: 0, - unlockedMevReward: 1, + vault: await vault.getAddress(), + reward: 0n, + unlockedMevReward: 1n, }), }) // small amount of shares own a lot of assets - expect(await vault.totalAssets()).to.eq(burnedAssets.add(1)) - expect(await vault.totalShares()).to.eq(securityDeposit.add(1)) + expect(await vault.totalAssets()).to.eq(burnedAssets + 1n) + expect(await vault.totalShares()).to.eq(securityDeposit + 1n) // user deposits - const userAssets = parseEther('10') + const userAssets = ethers.parseEther('10') await vault.connect(holder).deposit(holder.address, ZERO_ADDRESS, { value: userAssets }) // user lost ~ 10 gwei due to the inflation above expect(await vault.convertToAssets(await vault.getShares(holder.address))).to.eq( - BigNumber.from('10000000980198017861') + 10000000980198017861n ) }) it('only vault can harvest', async () => { await expect( - keeper.harvest({ rewardsRoot: ZERO_BYTES32, reward: 0, unlockedMevReward: 0, proof: [] }) - ).revertedWith('AccessDenied') + keeper.harvest({ rewardsRoot: ZERO_BYTES32, reward: 0n, unlockedMevReward: 0n, proof: [] }) + ).revertedWithCustomError(keeper, 'AccessDenied') }) it('only mev escrow can send ether', async () => { - await expect(vault.connect(other).receiveFromMevEscrow()).revertedWith('AccessDenied') + await expect(vault.connect(other).receiveFromMevEscrow()).revertedWithCustomError( + vault, + 'AccessDenied' + ) }) it('applies penalty when delta is below zero', async () => { - const penalty = parseEther('-0.5') - const rewardMevEscrow = parseEther('0.3') + const penalty = ethers.parseEther('-0.5') + const rewardMevEscrow = ethers.parseEther('0.3') await setBalance(await vault.mevEscrow(), rewardMevEscrow) const tree = await updateRewards(keeper, [ - { vault: vault.address, reward: penalty, unlockedMevReward: rewardMevEscrow }, + { vault: await vault.getAddress(), reward: penalty, unlockedMevReward: rewardMevEscrow }, ]) const proof = getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward: penalty, unlockedMevReward: rewardMevEscrow, }) @@ -197,16 +197,16 @@ describe('EthVault - state', () => { await expect(receipt) .emit(keeper, 'Harvested') - .withArgs(vault.address, tree.root, penalty, rewardMevEscrow) + .withArgs(await vault.getAddress(), tree.root, penalty, rewardMevEscrow) await expect(receipt) .emit(sharedMevEscrow, 'Harvested') - .withArgs(vault.address, rewardMevEscrow) + .withArgs(await vault.getAddress(), rewardMevEscrow) await expect(receipt).not.emit(vault, 'FeeSharesMinted') - expect(await waffle.provider.getBalance(vault.address)).to.be.eq( - rewardMevEscrow.add(holderAssets).add(SECURITY_DEPOSIT) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq( + rewardMevEscrow + holderAssets + SECURITY_DEPOSIT ) expect(await vault.totalShares()).to.be.eq(totalSharesBefore) - expect(await vault.totalAssets()).to.be.eq(totalAssetsBefore.add(penalty)) + expect(await vault.totalAssets()).to.be.eq(totalAssetsBefore + penalty) await snapshotGasCost(receipt) }) @@ -222,26 +222,25 @@ describe('EthVault - state', () => { true ) await vault.connect(holder).deposit(holder.address, ZERO_ADDRESS, { value: holderAssets }) - const ownMevEscrow = await ethers.getContractFactory('OwnMevEscrow') - const mevEscrow = ownMevEscrow.attach(await vault.mevEscrow()) as OwnMevEscrow - const rewardValidators = parseEther('0.5') - const rewardMevEscrow = parseEther('0.5') - const operatorReward = parseEther('0.1') - const reward = rewardValidators.add(rewardMevEscrow) + const mevEscrow = OwnMevEscrow__factory.connect(await vault.mevEscrow(), admin) + const rewardValidators = ethers.parseEther('0.5') + const rewardMevEscrow = ethers.parseEther('0.5') + const operatorReward = ethers.parseEther('0.1') + const reward = rewardValidators + rewardMevEscrow - await setBalance(mevEscrow.address, rewardMevEscrow) + await setBalance(await mevEscrow.getAddress(), rewardMevEscrow) const tree = await updateRewards(keeper, [ { - vault: vault.address, + vault: await vault.getAddress(), reward: rewardValidators, - unlockedMevReward: 0, + unlockedMevReward: 0n, }, ]) const proof = getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward: rewardValidators, - unlockedMevReward: 0, + unlockedMevReward: 0n, }) const totalSharesBefore = await vault.totalShares() @@ -249,27 +248,27 @@ describe('EthVault - state', () => { const receipt = await vault.updateState({ rewardsRoot: tree.root, reward: rewardValidators, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof, }) const operatorShares = await vault.getShares(admin.address) - expect(await vault.convertToAssets(operatorShares)).to.be.eq(operatorReward.sub(2)) // rounding error + expect(await vault.convertToAssets(operatorShares)).to.be.eq(operatorReward - 2n) // rounding error expect(await vault.convertToShares(operatorReward)).to.be.eq(operatorShares) - expect(await waffle.provider.getBalance(mevEscrow.address)).to.be.eq(0) + expect(await ethers.provider.getBalance(await mevEscrow.getAddress())).to.be.eq(0) await expect(receipt) .emit(keeper, 'Harvested') - .withArgs(vault.address, tree.root, rewardValidators, 0) - await expect(receipt).emit(ownMevEscrow, 'Harvested').withArgs(rewardMevEscrow) + .withArgs(await vault.getAddress(), tree.root, rewardValidators, 0) + await expect(receipt).emit(mevEscrow, 'Harvested').withArgs(rewardMevEscrow) await expect(receipt) .emit(vault, 'FeeSharesMinted') .withArgs(admin.address, operatorShares, operatorReward) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq( - rewardMevEscrow.add(holderAssets).add(SECURITY_DEPOSIT) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq( + rewardMevEscrow + holderAssets + SECURITY_DEPOSIT ) - expect(await vault.totalShares()).to.be.eq(totalSharesBefore.add(operatorShares)) - expect(await vault.totalAssets()).to.be.eq(totalAssetsBefore.add(reward)) + expect(await vault.totalShares()).to.be.eq(totalSharesBefore + operatorShares) + expect(await vault.totalAssets()).to.be.eq(totalAssetsBefore + reward) await snapshotGasCost(receipt) }) @@ -280,19 +279,19 @@ describe('EthVault - state', () => { const totalSharesBefore = await vault.totalShares() const totalAssetsBefore = await vault.totalAssets() - const rewardValidators = parseEther('0.5') - const unlockedMevReward = parseEther('0.5') - const reward = rewardValidators.add(unlockedMevReward) - await setBalance(sharedMevEscrow.address, unlockedMevReward) + const rewardValidators = ethers.parseEther('0.5') + const unlockedMevReward = ethers.parseEther('0.5') + const reward = rewardValidators + unlockedMevReward + await setBalance(await sharedMevEscrow.getAddress(), unlockedMevReward) const tree = await updateRewards(keeper, [ { - vault: vault.address, + vault: await vault.getAddress(), reward, unlockedMevReward, }, ]) const proof = getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward, unlockedMevReward, }) @@ -304,26 +303,26 @@ describe('EthVault - state', () => { proof, }) const operatorShares = await vault.getShares(admin.address) - expect(await waffle.provider.getBalance(sharedMevEscrow.address)).to.be.eq(0) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq( - unlockedMevReward.add(holderAssets).add(SECURITY_DEPOSIT) + expect(await ethers.provider.getBalance(await sharedMevEscrow.getAddress())).to.be.eq(0) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq( + unlockedMevReward + holderAssets + SECURITY_DEPOSIT ) await expect(receipt) .emit(keeper, 'Harvested') - .withArgs(vault.address, tree.root, reward, unlockedMevReward) + .withArgs(await vault.getAddress(), tree.root, reward, unlockedMevReward) await expect(receipt) .emit(sharedMevEscrow, 'Harvested') - .withArgs(vault.address, unlockedMevReward) + .withArgs(await vault.getAddress(), unlockedMevReward) await expect(receipt).emit(vault, 'CheckpointCreated') - let totalSharesAfter = totalSharesBefore.add(operatorShares) - let totalAssetsAfter = totalAssetsBefore.add(reward) + let totalSharesAfter = totalSharesBefore + operatorShares + let totalAssetsAfter = totalAssetsBefore + reward - const unclaimedAssets = holderAssets.add(unlockedMevReward).add(SECURITY_DEPOSIT) - const burnedShares = unclaimedAssets.mul(totalSharesAfter).div(totalAssetsAfter) + const unclaimedAssets = holderAssets + unlockedMevReward + SECURITY_DEPOSIT + const burnedShares = (unclaimedAssets * totalSharesAfter) / totalAssetsAfter - totalSharesAfter = totalSharesAfter.sub(burnedShares) - totalAssetsAfter = totalAssetsAfter.sub(unclaimedAssets) + totalSharesAfter = totalSharesAfter - burnedShares + totalAssetsAfter = totalAssetsAfter - unclaimedAssets expect(await vault.totalShares()).to.be.eq(totalSharesAfter) expect(await vault.totalAssets()).to.be.eq(totalAssetsAfter) diff --git a/test/EthVault.token.spec.ts b/test/EthVault.token.spec.ts index 9493da6c..f734a47d 100644 --- a/test/EthVault.token.spec.ts +++ b/test/EthVault.token.spec.ts @@ -1,7 +1,7 @@ -import { ethers, network, waffle } from 'hardhat' -import { BigNumber, Wallet } from 'ethers' -import { arrayify, parseEther } from 'ethers/lib/utils' +import { ethers, network } from 'hardhat' +import { Wallet } from 'ethers' import EthereumWallet from 'ethereumjs-wallet' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthErc20Vault } from '../typechain-types' import { ThenArg } from '../helpers/types' import { expect } from './shared/expect' @@ -13,29 +13,25 @@ import { SECURITY_DEPOSIT, ZERO_ADDRESS, } from './shared/constants' -import { domainSeparator, getSignatureFromTypedData, latestTimestamp } from './shared/utils' +import { domainSeparator, getLatestBlockTimestamp, getSignatureFromTypedData } from './shared/utils' import snapshotGasCost from './shared/snapshotGasCost' import { ethVaultFixture } from './shared/fixtures' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVault - token', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const name = 'SW ETH Vault' const symbol = 'SW-ETH-1' const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' - const initialSupply = 1000 + const initialSupply = 1000n let vault: EthErc20Vault - let admin: Wallet, dao: Wallet, initialHolder: Wallet, spender: Wallet, recipient: Wallet + let admin: Wallet, initialHolder: Wallet, spender: Wallet, recipient: Wallet - let loadFixture: ReturnType let createVault: ThenArg>['createEthErc20Vault'] before('create fixture loader', async () => { - ;[admin, dao, initialHolder, spender, recipient] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) + ;[admin, initialHolder, spender, recipient] = (await (ethers as any).getSigners()).slice(1, 5) }) beforeEach('deploy fixture', async () => { @@ -73,31 +69,31 @@ describe('EthVault - token', () => { symbol, metadataIpfsHash, }) - ).to.be.revertedWith('InvalidTokenMeta') + ).to.be.revertedWithCustomError(vault, 'InvalidTokenMeta') }) it('fails to deploy with zero capacity', async () => { await expect( createVault(admin, { - capacity: 0, + capacity: 0n, feePercent, name, symbol, metadataIpfsHash, }) - ).to.be.revertedWith('InvalidCapacity') + ).to.be.revertedWithCustomError(vault, 'InvalidCapacity') }) it('fails to deploy with capacity less than validator deposit amount', async () => { await expect( createVault(admin, { - capacity: parseEther('31'), + capacity: ethers.parseEther('31'), feePercent, name, symbol, metadataIpfsHash, }) - ).to.be.revertedWith('InvalidCapacity') + ).to.be.revertedWithCustomError(vault, 'InvalidCapacity') }) it('fails to deploy with invalid symbol length', async () => { @@ -109,12 +105,12 @@ describe('EthVault - token', () => { symbol: 'a'.repeat(21), metadataIpfsHash, }) - ).to.be.revertedWith('InvalidTokenMeta') + ).to.be.revertedWithCustomError(vault, 'InvalidTokenMeta') }) describe('total supply', () => { it('returns the total amount of tokens', async () => { - expect(await vault.totalSupply()).to.eq(BigNumber.from(SECURITY_DEPOSIT).add(initialSupply)) + expect(await vault.totalSupply()).to.eq(SECURITY_DEPOSIT + initialSupply) }) }) @@ -136,16 +132,16 @@ describe('EthVault - token', () => { const balance = initialSupply it('reverts when the sender does not have enough balance', async () => { - const amount = balance + 1 + const amount = balance + 1n await expect( vault.connect(initialHolder).transfer(recipient.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('reverts with zero address recipient', async () => { - await expect(vault.connect(initialHolder).transfer(ZERO_ADDRESS, balance)).to.be.revertedWith( - 'ZeroAddress' - ) + await expect( + vault.connect(initialHolder).transfer(ZERO_ADDRESS, balance) + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) describe('when the sender transfers all balance', () => { @@ -226,13 +222,13 @@ describe('EthVault - token', () => { it('reverts', async () => { await expect( vault.connect(spender).transferFrom(initialHolder.address, spender.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) }) describe('when the spender does not have enough allowance', () => { - const allowance = initialSupply - 1 + const allowance = initialSupply - 1n beforeEach(async () => { await vault.connect(initialHolder).approve(spender.address, allowance) @@ -244,7 +240,7 @@ describe('EthVault - token', () => { it('reverts', async () => { await expect( vault.connect(spender).transferFrom(initialHolder.address, spender.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) @@ -258,7 +254,7 @@ describe('EthVault - token', () => { it('reverts', async () => { await expect( vault.connect(spender).transferFrom(initialHolder.address, spender.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) }) @@ -280,10 +276,10 @@ describe('EthVault - token', () => { describe('approve', () => { it('fails to approve zero address', async () => { - const amount = parseEther('1') - await expect(vault.connect(initialHolder).approve(ZERO_ADDRESS, amount)).to.be.revertedWith( - 'ZeroAddress' - ) + const amount = ethers.parseEther('1') + await expect( + vault.connect(initialHolder).approve(ZERO_ADDRESS, amount) + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) describe('when the sender has enough balance', () => { @@ -317,7 +313,7 @@ describe('EthVault - token', () => { }) describe('when the sender does not have enough balance', () => { - const amount = initialSupply + 1 + const amount = initialSupply + 1n it('emits an approval event', async () => { await expect(vault.connect(initialHolder).approve(spender.address, amount)) @@ -371,14 +367,14 @@ describe('EthVault - token', () => { it('increases the spender allowance adding the requested amount', async () => { await vault.connect(initialHolder).increaseAllowance(spender.address, amount) expect(await vault.allowance(initialHolder.address, spender.address)).to.be.eq( - amount + 1 + amount + 1n ) }) }) }) describe('when the sender does not have enough balance', () => { - const amount = initialSupply + 1 + const amount = initialSupply + 1n it('emits an approval event', async () => { await expect(vault.connect(initialHolder).increaseAllowance(spender.address, amount)) @@ -406,7 +402,7 @@ describe('EthVault - token', () => { .connect(initialHolder) .increaseAllowance(spender.address, amount) expect(await vault.allowance(initialHolder.address, spender.address)).to.eq( - amount + 1 + amount + 1n ) await snapshotGasCost(receipt) }) @@ -418,7 +414,7 @@ describe('EthVault - token', () => { it('reverts', async () => { await expect( vault.connect(initialHolder).increaseAllowance(ZERO_ADDRESS, amount) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) }) }) @@ -430,7 +426,7 @@ describe('EthVault - token', () => { it('reverts', async () => { await expect( vault.connect(initialHolder).decreaseAllowance(spender.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) @@ -454,7 +450,7 @@ describe('EthVault - token', () => { it('decreases the spender allowance subtracting the requested amount', async () => { const receipt = await vault .connect(initialHolder) - .decreaseAllowance(spender.address, approvedAmount - 1) + .decreaseAllowance(spender.address, approvedAmount - 1n) expect(await vault.allowance(initialHolder.address, spender.address)).to.eq('1') await snapshotGasCost(receipt) }) @@ -466,8 +462,8 @@ describe('EthVault - token', () => { it('reverts when more than the full allowance is removed', async () => { await expect( - vault.connect(initialHolder).decreaseAllowance(spender.address, approvedAmount + 1) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + vault.connect(initialHolder).decreaseAllowance(spender.address, approvedAmount + 1n) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) } @@ -477,7 +473,7 @@ describe('EthVault - token', () => { }) describe('when the sender does not have enough balance', () => { - const amount = initialSupply + 1 + const amount = initialSupply + 1n shouldDecreaseApproval(amount) }) @@ -490,7 +486,7 @@ describe('EthVault - token', () => { it('reverts', async () => { await expect( vault.connect(initialHolder).decreaseAllowance(spender, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) }) @@ -503,19 +499,21 @@ describe('EthVault - token', () => { const chainId = network.config.chainId const owner = new EthereumWallet( - Buffer.from(arrayify('0x35a1c4d02b06d93778758410e5c09e010760268cf98b1af33c2d0646f27a8b70')) + Buffer.from( + ethers.getBytes('0x35a1c4d02b06d93778758410e5c09e010760268cf98b1af33c2d0646f27a8b70') + ) ) const ownerAddress = owner.getChecksumAddressString() const ownerPrivateKey = owner.getPrivateKey() - const buildData = (deadline = maxDeadline, spender) => ({ + const buildData = async (deadline = maxDeadline, spender) => ({ primaryType: 'Permit', types: { EIP712Domain, Permit: PermitSig }, domain: { name, version: '1', chainId, - verifyingContract: vault.address, + verifyingContract: await vault.getAddress(), }, message: { owner: ownerAddress, spender, value, nonce, deadline }, }) @@ -526,14 +524,14 @@ describe('EthVault - token', () => { it('domain separator', async () => { expect(await vault.DOMAIN_SEPARATOR()).to.equal( - await domainSeparator(name, '1', chainId, vault.address) + await domainSeparator(name, '1', chainId, await vault.getAddress()) ) }) it('accepts owner signature', async () => { const { v, r, s } = getSignatureFromTypedData( ownerPrivateKey, - buildData(maxDeadline, spender.address) + await buildData(maxDeadline, spender.address) ) const receipt = await vault.permit(ownerAddress, spender.address, value, maxDeadline, v, r, s) @@ -550,48 +548,48 @@ describe('EthVault - token', () => { it('rejects reused signature', async () => { const { v, r, s } = getSignatureFromTypedData( ownerPrivateKey, - buildData(maxDeadline, spender.address) + await buildData(maxDeadline, spender.address) ) await vault.permit(ownerAddress, spender.address, value, maxDeadline, v, r, s) await expect( vault.permit(initialHolder.address, spender.address, value, maxDeadline, v, r, s) - ).to.be.revertedWith('PermitInvalidSigner') + ).to.be.revertedWithCustomError(vault, 'PermitInvalidSigner') }) it('rejects other signature', async () => { const otherWallet = EthereumWallet.generate() - const data = buildData(maxDeadline, spender.address) + const data = await buildData(maxDeadline, spender.address) const { v, r, s } = getSignatureFromTypedData(otherWallet.getPrivateKey(), data) await expect( vault.permit(ownerAddress, spender.address, value, maxDeadline, v, r, s) - ).to.be.revertedWith('PermitInvalidSigner') + ).to.be.revertedWithCustomError(vault, 'PermitInvalidSigner') }) it('rejects expired permit', async () => { - const deadline = (await latestTimestamp()).sub(500).toString() + const deadline = ((await getLatestBlockTimestamp()) - 500).toString() const { v, r, s } = getSignatureFromTypedData( ownerPrivateKey, - buildData(deadline, spender.address) + await buildData(deadline, spender.address) ) await expect( vault.permit(ownerAddress, spender.address, value, deadline, v, r, s) - ).to.be.revertedWith('DeadlineExpired') + ).to.be.revertedWithCustomError(vault, 'DeadlineExpired') }) it('rejects zero address', async () => { - const deadline = (await latestTimestamp()).sub(500).toString() + const deadline = ((await getLatestBlockTimestamp()) - 500).toString() const { v, r, s } = getSignatureFromTypedData( ownerPrivateKey, - buildData(deadline, ZERO_ADDRESS) + await buildData(deadline, ZERO_ADDRESS) ) await expect( vault.permit(ownerAddress, ZERO_ADDRESS, value, deadline, v, r, s) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) }) }) diff --git a/test/EthVault.upgrade.spec.ts b/test/EthVault.upgrade.spec.ts index 56e35f3e..4dff4005 100644 --- a/test/EthVault.upgrade.spec.ts +++ b/test/EthVault.upgrade.spec.ts @@ -1,16 +1,19 @@ -import { ethers, upgrades, waffle } from 'hardhat' +import { ethers, upgrades } from 'hardhat' import { Wallet } from 'ethers' -import { defaultAbiCoder, parseEther } from 'ethers/lib/utils' -import { EthVault, EthVaultV2Mock, VaultsRegistry } from '../typechain-types' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { + EthVault, + EthVaultV2Mock, + VaultsRegistry, + EthVaultV2Mock__factory, +} from '../typechain-types' import snapshotGasCost from './shared/snapshotGasCost' import { ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' import { EXITING_ASSETS_MIN_DELAY, MAX_UINT256, ZERO_ADDRESS } from './shared/constants' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVault - upgrade', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7r' let admin: Wallet, dao: Wallet, other: Wallet @@ -20,16 +23,10 @@ describe('EthVault - upgrade', () => { let currImpl: string let newImpl: string let callData: string - - let loadFixture: ReturnType - let fixture - - before('create fixture loader', async () => { - ;[dao, admin, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) + let fixture: any beforeEach('deploy fixture', async () => { + ;[dao, admin, other] = await (ethers as any).getSigners() fixture = await loadFixture(ethVaultFixture) vaultsRegistry = fixture.vaultsRegistry vault = await fixture.createEthVault(admin, { @@ -42,52 +39,58 @@ describe('EthVault - upgrade', () => { newImpl = (await upgrades.deployImplementation(ethVaultMock, { unsafeAllow: ['delegatecall'], constructorArgs: [ - fixture.keeper.address, - vaultsRegistry.address, - fixture.validatorsRegistry.address, - fixture.osToken.address, - fixture.osTokenConfig.address, - fixture.sharedMevEscrow.address, + await fixture.keeper.getAddress(), + await vaultsRegistry.getAddress(), + await fixture.validatorsRegistry.getAddress(), + await fixture.osToken.getAddress(), + await fixture.osTokenConfig.getAddress(), + await fixture.sharedMevEscrow.getAddress(), EXITING_ASSETS_MIN_DELAY, ], })) as string currImpl = await vault.implementation() - callData = defaultAbiCoder.encode(['uint128'], [100]) + callData = ethers.AbiCoder.defaultAbiCoder().encode(['uint128'], [100]) await vaultsRegistry.connect(dao).addVaultImpl(newImpl) - updatedVault = (await ethVaultMock.attach(vault.address)) as EthVaultV2Mock + updatedVault = EthVaultV2Mock__factory.connect( + await vault.getAddress(), + await ethers.provider.getSigner() + ) }) it('fails without the call', async () => { - await expect(vault.connect(admin).upgradeTo(newImpl)).to.revertedWith('UpgradeFailed') + await expect(vault.connect(admin).upgradeTo(newImpl)).to.revertedWithCustomError( + vault, + 'UpgradeFailed' + ) expect(await vault.version()).to.be.eq(1) }) it('fails from not admin', async () => { - await expect(vault.connect(other).upgradeToAndCall(newImpl, callData)).to.revertedWith( - 'AccessDenied' - ) + await expect( + vault.connect(other).upgradeToAndCall(newImpl, callData) + ).to.revertedWithCustomError(vault, 'AccessDenied') expect(await vault.version()).to.be.eq(1) }) it('fails with zero new implementation address', async () => { - await expect(vault.connect(admin).upgradeToAndCall(ZERO_ADDRESS, callData)).to.revertedWith( - 'UpgradeFailed' - ) + await expect( + vault.connect(admin).upgradeToAndCall(ZERO_ADDRESS, callData) + ).to.revertedWithCustomError(vault, 'UpgradeFailed') expect(await vault.version()).to.be.eq(1) }) it('fails for the same implementation', async () => { - await expect(vault.connect(admin).upgradeToAndCall(currImpl, callData)).to.revertedWith( - 'UpgradeFailed' - ) + await expect( + vault.connect(admin).upgradeToAndCall(currImpl, callData) + ).to.revertedWithCustomError(vault, 'UpgradeFailed') expect(await vault.version()).to.be.eq(1) }) it('fails for not approved implementation', async () => { await vaultsRegistry.connect(dao).removeVaultImpl(newImpl) - await expect(vault.connect(admin).upgradeToAndCall(newImpl, callData)).to.revertedWith( - 'UpgradeFailed' - ) + await expect( + vault.connect(admin).upgradeToAndCall(newImpl, callData) + ).to.revertedWithCustomError(vault, 'UpgradeFailed') expect(await vault.version()).to.be.eq(1) }) @@ -96,20 +99,20 @@ describe('EthVault - upgrade', () => { const newImpl = (await upgrades.deployImplementation(ethVaultMock, { unsafeAllow: ['delegatecall'], constructorArgs: [ - fixture.keeper.address, - vaultsRegistry.address, - fixture.validatorsRegistry.address, - fixture.osToken.address, - fixture.osTokenConfig.address, - fixture.sharedMevEscrow.address, + await fixture.keeper.getAddress(), + await vaultsRegistry.getAddress(), + await fixture.validatorsRegistry.getAddress(), + await fixture.osToken.getAddress(), + await fixture.osTokenConfig.getAddress(), + await fixture.sharedMevEscrow.getAddress(), EXITING_ASSETS_MIN_DELAY, ], })) as string - callData = defaultAbiCoder.encode(['uint128'], [100]) + callData = ethers.AbiCoder.defaultAbiCoder().encode(['uint128'], [100]) await vaultsRegistry.connect(dao).addVaultImpl(newImpl) - await expect(vault.connect(admin).upgradeToAndCall(newImpl, callData)).to.revertedWith( - 'UpgradeFailed' - ) + await expect( + vault.connect(admin).upgradeToAndCall(newImpl, callData) + ).to.revertedWithCustomError(vault, 'UpgradeFailed') expect(await vault.version()).to.be.eq(1) }) @@ -118,20 +121,20 @@ describe('EthVault - upgrade', () => { const newImpl = (await upgrades.deployImplementation(ethVaultMock, { unsafeAllow: ['delegatecall'], constructorArgs: [ - fixture.keeper.address, - vaultsRegistry.address, - fixture.validatorsRegistry.address, - fixture.osToken.address, - fixture.osTokenConfig.address, - fixture.sharedMevEscrow.address, + await fixture.keeper.getAddress(), + await vaultsRegistry.getAddress(), + await fixture.validatorsRegistry.getAddress(), + await fixture.osToken.getAddress(), + await fixture.osTokenConfig.getAddress(), + await fixture.sharedMevEscrow.getAddress(), EXITING_ASSETS_MIN_DELAY, ], })) as string - callData = defaultAbiCoder.encode(['uint128'], [100]) + callData = ethers.AbiCoder.defaultAbiCoder().encode(['uint128'], [100]) await vaultsRegistry.connect(dao).addVaultImpl(newImpl) - await expect(vault.connect(admin).upgradeToAndCall(newImpl, callData)).to.revertedWith( - 'UpgradeFailed' - ) + await expect( + vault.connect(admin).upgradeToAndCall(newImpl, callData) + ).to.revertedWithCustomError(vault, 'UpgradeFailed') expect(await vault.version()).to.be.eq(1) }) @@ -139,7 +142,10 @@ describe('EthVault - upgrade', () => { await expect( vault .connect(admin) - .upgradeToAndCall(newImpl, defaultAbiCoder.encode(['uint256'], [MAX_UINT256])) + .upgradeToAndCall( + newImpl, + ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [MAX_UINT256]) + ) ).to.revertedWith('Address: low-level delegate call failed') expect(await vault.version()).to.be.eq(1) }) @@ -150,9 +156,9 @@ describe('EthVault - upgrade', () => { expect(await vault.implementation()).to.be.eq(newImpl) expect(await updatedVault.newVar()).to.be.eq(100) expect(await updatedVault.somethingNew()).to.be.eq(true) - await expect(vault.connect(admin).upgradeToAndCall(newImpl, callData)).to.revertedWith( - 'UpgradeFailed' - ) + await expect( + vault.connect(admin).upgradeToAndCall(newImpl, callData) + ).to.revertedWithCustomError(vault, 'UpgradeFailed') await expect(updatedVault.connect(admin).initialize(callData)).to.revertedWith( 'Initializable: contract is already initialized' ) diff --git a/test/EthVault.whitelist.spec.ts b/test/EthVault.whitelist.spec.ts index a0021915..dfd27cb2 100644 --- a/test/EthVault.whitelist.spec.ts +++ b/test/EthVault.whitelist.spec.ts @@ -1,30 +1,26 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthPrivVault, Keeper, IKeeperRewards } from '../typechain-types' import { ThenArg } from '../helpers/types' -import { ethVaultFixture } from './shared/fixtures' +import { createDepositorMock, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' import { ZERO_ADDRESS } from './shared/constants' import snapshotGasCost from './shared/snapshotGasCost' import { collateralizeEthVault, getRewardsRootProof, updateRewards } from './shared/rewards' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVault - whitelist', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const referrer = ZERO_ADDRESS const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' - let dao: Wallet, sender: Wallet, whitelister: Wallet, admin: Wallet, other: Wallet + let sender: Wallet, whitelister: Wallet, admin: Wallet, other: Wallet let vault: EthPrivVault, keeper: Keeper, validatorsRegistry: Contract - let loadFixture: ReturnType let createPrivateVault: ThenArg>['createEthPrivVault'] before('create fixture loader', async () => { - ;[dao, sender, whitelister, admin, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) + ;[sender, whitelister, admin, other] = (await (ethers as any).getSigners()).slice(1, 5) }) beforeEach('deploy fixtures', async () => { @@ -42,9 +38,9 @@ describe('EthVault - whitelist', () => { describe('set whitelister', () => { it('cannot be called by not admin', async () => { - await expect(vault.connect(other).setWhitelister(whitelister.address)).to.revertedWith( - 'AccessDenied' - ) + await expect( + vault.connect(other).setWhitelister(whitelister.address) + ).to.revertedWithCustomError(vault, 'AccessDenied') }) it('admin can update whitelister', async () => { @@ -63,16 +59,16 @@ describe('EthVault - whitelist', () => { }) it('cannot be updated by not whitelister', async () => { - await expect(vault.connect(other).updateWhitelist(sender.address, true)).to.revertedWith( - 'AccessDenied' - ) + await expect( + vault.connect(other).updateWhitelist(sender.address, true) + ).to.revertedWithCustomError(vault, 'AccessDenied') }) it('cannot be updated twice', async () => { await vault.connect(whitelister).updateWhitelist(sender.address, true) await expect( vault.connect(whitelister).updateWhitelist(sender.address, true) - ).to.revertedWith('WhitelistAlreadyUpdated') + ).to.revertedWithCustomError(vault, 'WhitelistAlreadyUpdated') }) it('can be updated by whitelister', async () => { @@ -95,7 +91,7 @@ describe('EthVault - whitelist', () => { }) describe('deposit', () => { - const amount = parseEther('1') + const amount = ethers.parseEther('1') beforeEach(async () => { await vault.connect(admin).updateWhitelist(sender.address, true) @@ -104,23 +100,23 @@ describe('EthVault - whitelist', () => { it('cannot be called by not whitelisted sender', async () => { await expect( vault.connect(other).deposit(other.address, referrer, { value: amount }) - ).to.revertedWith('AccessDenied') + ).to.revertedWithCustomError(vault, 'AccessDenied') }) it('cannot update state and call', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const vaultReward = parseEther('1') + const vaultReward = ethers.parseEther('1') const tree = await updateRewards(keeper, [ - { reward: vaultReward, unlockedMevReward: 0, vault: vault.address }, + { reward: vaultReward, unlockedMevReward: 0n, vault: await vault.getAddress() }, ]) const harvestParams: IKeeperRewards.HarvestParamsStruct = { rewardsRoot: tree.root, reward: vaultReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, reward: vaultReward, }), } @@ -128,13 +124,13 @@ describe('EthVault - whitelist', () => { vault .connect(other) .updateStateAndDeposit(other.address, referrer, harvestParams, { value: amount }) - ).to.revertedWith('AccessDenied') + ).to.revertedWithCustomError(vault, 'AccessDenied') }) it('cannot set receiver to not whitelisted user', async () => { await expect( vault.connect(other).deposit(other.address, referrer, { value: amount }) - ).to.revertedWith('AccessDenied') + ).to.revertedWithCustomError(vault, 'AccessDenied') }) it('can be called by whitelisted user', async () => { @@ -150,37 +146,29 @@ describe('EthVault - whitelist', () => { }) it('deposit through receive fallback cannot be called by not whitelisted sender', async () => { - const depositorMockFactory = await ethers.getContractFactory('DepositorMock') - const depositorMock = await depositorMockFactory.deploy(vault.address) - - const amount = parseEther('100') - const expectedShares = parseEther('100') + const depositorMock = await createDepositorMock(vault) + const amount = ethers.parseEther('100') + const expectedShares = ethers.parseEther('100') expect(await vault.convertToShares(amount)).to.eq(expectedShares) - await expect(depositorMock.connect(sender).depositToVault({ value: amount })).to.revertedWith( - 'DepositFailed' - ) + await expect( + depositorMock.connect(sender).depositToVault({ value: amount }) + ).to.revertedWithCustomError(depositorMock, 'DepositFailed') }) it('deposit through receive fallback can be called by whitelisted sender', async () => { - const depositorMockFactory = await ethers.getContractFactory('DepositorMock') - const depositorMock = await depositorMockFactory.deploy(vault.address) - await vault.connect(admin).updateWhitelist(depositorMock.address, true) + const depositorMock = await createDepositorMock(vault) + const depositorMockAddress = await depositorMock.getAddress() + await vault.connect(admin).updateWhitelist(depositorMockAddress, true) - const amount = parseEther('100') - const expectedShares = parseEther('100') + const amount = ethers.parseEther('100') + const expectedShares = ethers.parseEther('100') expect(await vault.convertToShares(amount)).to.eq(expectedShares) const receipt = await depositorMock.connect(sender).depositToVault({ value: amount }) - expect(await vault.getShares(depositorMock.address)).to.eq(expectedShares) + expect(await vault.getShares(depositorMockAddress)).to.eq(expectedShares) await expect(receipt) .to.emit(vault, 'Deposited') - .withArgs( - depositorMock.address, - depositorMock.address, - amount, - expectedShares, - ZERO_ADDRESS - ) + .withArgs(depositorMockAddress, depositorMockAddress, amount, expectedShares, ZERO_ADDRESS) await snapshotGasCost(receipt) }) }) diff --git a/test/EthVault.withdraw.spec.ts b/test/EthVault.withdraw.spec.ts index f9302826..b57a8a88 100644 --- a/test/EthVault.withdraw.spec.ts +++ b/test/EthVault.withdraw.spec.ts @@ -1,6 +1,6 @@ -import { ethers, waffle } from 'hardhat' -import { BigNumber, Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { ethers } from 'hardhat' +import { Contract, Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthVault, EthVaultMock, IKeeperRewards, Keeper, SharedMevEscrow } from '../typechain-types' import { ThenArg } from '../helpers/types' import snapshotGasCost from './shared/snapshotGasCost' @@ -23,33 +23,27 @@ import { import { collateralizeEthVault, getRewardsRootProof, updateRewards } from './shared/rewards' import { registerEthValidator } from './shared/validators' -const createFixtureLoader = waffle.createFixtureLoader -const validatorDeposit = parseEther('32') +const validatorDeposit = ethers.parseEther('32') describe('EthVault - withdraw', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const referrer = '0x' + '1'.repeat(40) const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' - const holderShares = parseEther('1') - const holderAssets = parseEther('1') + const holderShares = ethers.parseEther('1') + const holderAssets = ethers.parseEther('1') - let holder: Wallet, receiver: Wallet, admin: Wallet, dao: Wallet, other: Wallet + let holder: Wallet, receiver: Wallet, admin: Wallet, other: Wallet let vault: EthVault, keeper: Keeper, sharedMevEscrow: SharedMevEscrow, validatorsRegistry: Contract - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] let createVaultMock: ThenArg>['createEthVaultMock'] - before('create fixture loader', async () => { - ;[holder, receiver, dao, admin, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) - }) - beforeEach('deploy fixture', async () => { + ;[holder, receiver, admin, other] = (await (ethers as any).getSigners()).slice(1, 5) ;({ createEthVault: createVault, createEthVaultMock: createVaultMock, @@ -68,32 +62,32 @@ describe('EthVault - withdraw', () => { describe('redeem', () => { it('fails with not enough balance', async () => { - await setBalance(vault.address, BigNumber.from(0)) - await expect(vault.connect(holder).redeem(holderShares, receiver.address)).to.be.revertedWith( - 'InsufficientAssets' - ) + await setBalance(await vault.getAddress(), 0n) + await expect( + vault.connect(holder).redeem(holderShares, receiver.address) + ).to.be.revertedWithCustomError(vault, 'InsufficientAssets') }) it('fails for sender other than owner without approval', async () => { - await expect(vault.connect(other).redeem(holderShares, receiver.address)).to.be.revertedWith( - PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW - ) + await expect( + vault.connect(other).redeem(holderShares, receiver.address) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('fails for shares larger than balance', async () => { - const newBalance = holderShares.add(1) - await setBalance(vault.address, newBalance) - await expect(vault.connect(holder).redeem(newBalance, receiver.address)).to.be.revertedWith( - PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW - ) + const newBalance = holderShares + 1n + await setBalance(await vault.getAddress(), newBalance) + await expect( + vault.connect(holder).redeem(newBalance, receiver.address) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('fails for zero address receiver', async () => { - const newBalance = holderShares.add(1) - await setBalance(vault.address, newBalance) - await expect(vault.connect(holder).redeem(newBalance, ZERO_ADDRESS)).to.be.revertedWith( - 'ZeroAddress' - ) + const newBalance = holderShares + 1n + await setBalance(await vault.getAddress(), newBalance) + await expect( + vault.connect(holder).redeem(newBalance, ZERO_ADDRESS) + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) it('does not overflow', async () => { @@ -105,27 +99,27 @@ describe('EthVault - withdraw', () => { await vault.resetSecurityDeposit() await vault.connect(holder).deposit(holder.address, referrer, { value: holderAssets }) - const receiverBalanceBefore = await waffle.provider.getBalance(receiver.address) + const receiverBalanceBefore = await ethers.provider.getBalance(receiver.address) - await setBalance(await vault.address, MAX_UINT128) + await setBalance(await vault.getAddress(), MAX_UINT128) await vault._setTotalAssets(MAX_UINT128) await vault.connect(holder).redeem(holderShares, receiver.address) expect(await vault.totalAssets()).to.be.eq(0) - expect(await waffle.provider.getBalance(receiver.address)).to.be.eq( - receiverBalanceBefore.add(MAX_UINT128) + expect(await ethers.provider.getBalance(receiver.address)).to.be.eq( + receiverBalanceBefore + MAX_UINT128 ) }) it('fails for collateralized', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - await expect(vault.connect(holder).redeem(holderShares, receiver.address)).to.be.revertedWith( - 'Collateralized' - ) + await expect( + vault.connect(holder).redeem(holderShares, receiver.address) + ).to.be.revertedWithCustomError(vault, 'Collateralized') }) it('redeem transfers assets to receiver', async () => { - const receiverBalanceBefore = await waffle.provider.getBalance(receiver.address) + const receiverBalanceBefore = await ethers.provider.getBalance(receiver.address) const receipt = await vault.connect(holder).redeem(holderShares, receiver.address) await expect(receipt) .to.emit(vault, 'Redeemed') @@ -134,9 +128,9 @@ describe('EthVault - withdraw', () => { expect(await vault.totalAssets()).to.be.eq(SECURITY_DEPOSIT) expect(await vault.totalShares()).to.be.eq(SECURITY_DEPOSIT) expect(await vault.getShares(holder.address)).to.be.eq(0) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq(SECURITY_DEPOSIT) - expect(await waffle.provider.getBalance(receiver.address)).to.be.eq( - receiverBalanceBefore.add(holderAssets) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq(SECURITY_DEPOSIT) + expect(await ethers.provider.getBalance(receiver.address)).to.be.eq( + receiverBalanceBefore + holderAssets ) await snapshotGasCost(receipt) @@ -149,15 +143,15 @@ describe('EthVault - withdraw', () => { }) it('fails with 0 shares', async () => { - await expect(vault.connect(holder).enterExitQueue(0, receiver.address)).to.be.revertedWith( - 'InvalidShares' - ) + await expect( + vault.connect(holder).enterExitQueue(0, receiver.address) + ).to.be.revertedWithCustomError(vault, 'InvalidShares') }) it('fails for zero address receiver', async () => { await expect( vault.connect(holder).enterExitQueue(holderShares, ZERO_ADDRESS) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(vault, 'ZeroAddress') }) it('fails for not collateralized', async () => { @@ -167,28 +161,28 @@ describe('EthVault - withdraw', () => { metadataIpfsHash, }) await newVault.connect(holder).deposit(holder.address, referrer, { value: holderAssets }) - await setBalance(newVault.address, BigNumber.from(0)) + await setBalance(await vault.getAddress(), 0n) await expect( newVault.connect(holder).enterExitQueue(holderShares, receiver.address) - ).to.be.revertedWith('NotCollateralized') + ).to.be.revertedWithCustomError(vault, 'NotCollateralized') }) it('fails for sender other than owner without approval', async () => { await expect( vault.connect(other).enterExitQueue(holderShares, receiver.address) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('fails for shares larger than balance', async () => { await expect( - vault.connect(holder).enterExitQueue(holderShares.add(1), receiver.address) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + vault.connect(holder).enterExitQueue(holderShares + 1n, receiver.address) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('locks shares for the time of exit', async () => { expect(await vault.queuedShares()).to.be.eq(0) expect(await vault.getShares(holder.address)).to.be.eq(holderShares) - expect(await vault.getShares(vault.address)).to.be.eq(SECURITY_DEPOSIT) + expect(await vault.getShares(await vault.getAddress())).to.be.eq(SECURITY_DEPOSIT) const receipt = await vault.connect(holder).enterExitQueue(holderShares, receiver.address) await expect(receipt) @@ -209,16 +203,16 @@ describe('EthVault - withdraw', () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) await vault.connect(holder).enterExitQueue(holderShares, receiver.address) const tree = await updateRewards(keeper, [ - { vault: vault.address, reward: 0, unlockedMevReward: 0 }, + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, ]) harvestParams = { rewardsRoot: tree.root, - reward: 0, - unlockedMevReward: 0, + reward: 0n, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - reward: 0, - unlockedMevReward: 0, + vault: await vault.getAddress(), + reward: 0n, + unlockedMevReward: 0n, }), } }) @@ -228,16 +222,16 @@ describe('EthVault - withdraw', () => { expect(await vault.queuedShares()).to.be.eq(0) await increaseTime(ONE_DAY) const tree = await updateRewards(keeper, [ - { vault: vault.address, reward: 0, unlockedMevReward: 0 }, + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, ]) const newHarvestParams = { rewardsRoot: tree.root, - reward: 0, - unlockedMevReward: 0, + reward: 0n, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - reward: 0, - unlockedMevReward: 0, + vault: await vault.getAddress(), + reward: 0n, + unlockedMevReward: 0n, }), } await expect(vault.updateState(newHarvestParams)).to.not.emit(vault, 'CheckpointCreated') @@ -245,34 +239,34 @@ describe('EthVault - withdraw', () => { it('skips with 0 burned assets', async () => { const totalAssets = await vault.totalAssets() - const penalty = totalAssets.sub(totalAssets.mul(2)) + const penalty = totalAssets - totalAssets * 2n const tree = await updateRewards(keeper, [ - { vault: vault.address, reward: penalty, unlockedMevReward: 0 }, + { vault: await vault.getAddress(), reward: penalty, unlockedMevReward: 0n }, ]) await expect( vault.updateState({ rewardsRoot: tree.root, reward: penalty, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward: penalty, - unlockedMevReward: 0, + unlockedMevReward: 0n, }), }) ).to.not.emit(vault, 'CheckpointCreated') }) it('for not all the queued shares', async () => { - const halfHolderAssets = holderAssets.div(2) - const halfHolderShares = holderShares.div(2) - await setBalance(vault.address, halfHolderAssets) + const halfHolderAssets = holderAssets / 2n + const halfHolderShares = holderShares / 2n + await setBalance(await vault.getAddress(), halfHolderAssets) const receipt = await vault.updateState(harvestParams) await expect(receipt) .to.emit(vault, 'CheckpointCreated') .withArgs(halfHolderShares, halfHolderAssets) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq(halfHolderAssets) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq(halfHolderAssets) expect(await vault.queuedShares()).to.be.eq(halfHolderShares) expect(await vault.getExitQueueIndex(validatorDeposit)).to.be.eq(1) @@ -282,8 +276,8 @@ describe('EthVault - withdraw', () => { it('adds checkpoint', async () => { const receipt = await vault.updateState(harvestParams) await expect(receipt).to.emit(vault, 'CheckpointCreated').withArgs(holderShares, holderAssets) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq( - holderAssets.add(SECURITY_DEPOSIT) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq( + holderAssets + SECURITY_DEPOSIT ) expect(await vault.getExitQueueIndex(0)).to.be.eq(0) expect(await vault.totalShares()).to.be.eq(SECURITY_DEPOSIT) @@ -306,25 +300,25 @@ describe('EthVault - withdraw', () => { await registerEthValidator(vault, keeper, validatorsRegistry, admin) const receipt = await vault.connect(holder).enterExitQueue(holderShares, receiver.address) - const positionTicket = extractExitPositionTicket(await receipt.wait()) + const positionTicket = await extractExitPositionTicket(receipt) // create checkpoints every day for 10 years for (let i = 1; i <= 3650; i++) { - await setBalance(vault.address, BigNumber.from(i)) + await setBalance(await vault.getAddress(), BigInt(i)) await increaseTime(ONE_DAY) const rewardsTree = await updateRewards(keeper, [ - { vault: vault.address, reward: 0, unlockedMevReward: 0 }, + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, ]) const proof = getRewardsRootProof(rewardsTree, { - vault: vault.address, - reward: 0, - unlockedMevReward: 0, + vault: await vault.getAddress(), + reward: 0n, + unlockedMevReward: 0n, }) await expect( vault.updateState({ rewardsRoot: rewardsTree.root, - reward: 0, - unlockedMevReward: 0, + reward: 0n, + unlockedMevReward: 0n, proof, }) ).to.emit(vault, 'CheckpointCreated') @@ -333,30 +327,29 @@ describe('EthVault - withdraw', () => { }) describe('claim exited assets', () => { - let receiverBalanceBefore: BigNumber - let positionTicket: BigNumber + let receiverBalanceBefore: bigint + let positionTicket: bigint let timestamp: number let harvestParams: IKeeperRewards.HarvestParamsStruct beforeEach(async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) const response = await vault.connect(holder).enterExitQueue(holderShares, receiver.address) - const receipt = await response.wait() - positionTicket = extractExitPositionTicket(receipt) - timestamp = await getBlockTimestamp(receipt) - receiverBalanceBefore = await waffle.provider.getBalance(receiver.address) + positionTicket = await extractExitPositionTicket(response) + timestamp = await getBlockTimestamp(response) + receiverBalanceBefore = await ethers.provider.getBalance(receiver.address) const tree = await updateRewards(keeper, [ - { vault: vault.address, reward: 0, unlockedMevReward: 0 }, + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, ]) harvestParams = { rewardsRoot: tree.root, - reward: 0, - unlockedMevReward: 0, + reward: 0n, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - reward: 0, - unlockedMevReward: 0, + vault: await vault.getAddress(), + reward: 0n, + unlockedMevReward: 0n, }), } }) @@ -367,7 +360,7 @@ describe('EthVault - withdraw', () => { const checkpointIndex = await vault.getExitQueueIndex(positionTicket) const result = await vault .connect(other) - .callStatic.claimExitedAssets(positionTicket, timestamp, checkpointIndex) + .claimExitedAssets.staticCall(positionTicket, timestamp, checkpointIndex) expect(result.newPositionTicket).to.be.eq(positionTicket) expect(result.claimedAssets).to.be.eq(0) await expect( @@ -383,12 +376,12 @@ describe('EthVault - withdraw', () => { await increaseTime(EXITING_ASSETS_MIN_DELAY) const result = await vault .connect(receiver) - .callStatic.claimExitedAssets(positionTicket, timestamp, 1) + .claimExitedAssets.staticCall(positionTicket, timestamp, 1) expect(result.newPositionTicket).to.be.eq(validatorDeposit) expect(result.claimedAssets).to.be.eq(0) - expect(await waffle.provider.getBalance(receiver.address)).to.be.eq(receiverBalanceBefore) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq( - holderAssets.add(SECURITY_DEPOSIT) + expect(await ethers.provider.getBalance(receiver.address)).to.be.eq(receiverBalanceBefore) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq( + holderAssets + SECURITY_DEPOSIT ) }) @@ -396,27 +389,29 @@ describe('EthVault - withdraw', () => { await vault.updateState(harvestParams) const checkpointIndex = await vault.getExitQueueIndex(positionTicket) - await vault.connect(holder).deposit(holder.address, referrer, { value: holderAssets.mul(2) }) + await vault.connect(holder).deposit(holder.address, referrer, { value: holderAssets * 2n }) let response = await vault.connect(holder).enterExitQueue(holderShares, receiver.address) - let receipt = await response.wait() - const positionTicket2 = extractExitPositionTicket(receipt) - const timestamp2 = await getBlockTimestamp(receipt) + const positionTicket2 = await extractExitPositionTicket(response) + const timestamp2 = await getBlockTimestamp(response) await increaseTime(EXITING_ASSETS_MIN_DELAY) // checkpointIndex is lower than positionTicket await expect( vault.connect(receiver).claimExitedAssets(positionTicket2, timestamp2, checkpointIndex) - ).to.be.revertedWith('InvalidCheckpointIndex') + ).to.be.revertedWithCustomError(vault, 'InvalidCheckpointIndex') await increaseTime(ONE_DAY) - await updateRewards(keeper, [{ vault: vault.address, reward: 0, unlockedMevReward: 0 }]) + await updateRewards(keeper, [ + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, + ]) await vault.updateState(harvestParams) response = await vault.connect(holder).enterExitQueue(holderShares, receiver.address) - receipt = await response.wait() - const positionTicket3 = extractExitPositionTicket(receipt) + const positionTicket3 = await extractExitPositionTicket(response) await increaseTime(ONE_DAY) - await updateRewards(keeper, [{ vault: vault.address, reward: 0, unlockedMevReward: 0 }]) + await updateRewards(keeper, [ + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, + ]) await vault.updateState(harvestParams) const checkpointIndexThree = await vault.getExitQueueIndex(positionTicket3) @@ -425,7 +420,7 @@ describe('EthVault - withdraw', () => { await expect( vault.connect(receiver).claimExitedAssets(positionTicket, timestamp, checkpointIndexThree) - ).to.be.revertedWith('InvalidCheckpointIndex') + ).to.be.revertedWithCustomError(vault, 'InvalidCheckpointIndex') }) it('fails with invalid timestamp', async () => { @@ -438,7 +433,7 @@ describe('EthVault - withdraw', () => { timestamp, await vault.getExitQueueIndex(positionTicket) ) - ).to.be.revertedWith('ClaimTooEarly') + ).to.be.revertedWithCustomError(vault, 'ClaimTooEarly') }) it('for single user in single checkpoint', async () => { @@ -452,30 +447,32 @@ describe('EthVault - withdraw', () => { await expect(receipt) .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(receiver.address, positionTicket, 0, holderAssets) - const tx = await receipt.wait() - const gasUsed = tx.effectiveGasPrice.mul(tx.cumulativeGasUsed) - expect(await waffle.provider.getBalance(receiver.address)).to.be.eq( - receiverBalanceBefore.add(holderAssets).sub(gasUsed) + const tx = (await receipt.wait()) as any + const gasUsed = BigInt(tx.cumulativeGasUsed * tx.gasPrice) + expect(await ethers.provider.getBalance(receiver.address)).to.be.eq( + receiverBalanceBefore + holderAssets - gasUsed ) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq(SECURITY_DEPOSIT) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq(SECURITY_DEPOSIT) await snapshotGasCost(receipt) }) it('for single user in multiple checkpoints in single transaction', async () => { - const halfHolderAssets = holderAssets.div(2) - const halfHolderShares = holderShares.div(2) + const halfHolderAssets = holderAssets / 2n + const halfHolderShares = holderShares / 2n // create two checkpoints - await setBalance(vault.address, halfHolderAssets) + await setBalance(await vault.getAddress(), halfHolderAssets) await expect(vault.updateState(harvestParams)) .to.emit(vault, 'CheckpointCreated') .withArgs(halfHolderShares, halfHolderAssets) const checkpointIndex = await vault.getExitQueueIndex(positionTicket) await increaseTime(ONE_DAY) - await setBalance(vault.address, holderAssets) - await updateRewards(keeper, [{ vault: vault.address, reward: 0, unlockedMevReward: 0 }]) + await setBalance(await vault.getAddress(), holderAssets) + await updateRewards(keeper, [ + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, + ]) await expect(vault.updateState(harvestParams)) .to.emit(vault, 'CheckpointCreated') .withArgs(halfHolderShares, halfHolderAssets) @@ -489,22 +486,22 @@ describe('EthVault - withdraw', () => { .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(receiver.address, positionTicket, 0, holderAssets) - const tx = await receipt.wait() - const gasUsed = tx.effectiveGasPrice.mul(tx.cumulativeGasUsed) - expect(await waffle.provider.getBalance(receiver.address)).to.be.eq( - receiverBalanceBefore.add(holderAssets).sub(gasUsed) + const tx = (await receipt.wait()) as any + const gasUsed = BigInt(tx.cumulativeGasUsed * tx.gasPrice) + expect(await ethers.provider.getBalance(receiver.address)).to.be.eq( + receiverBalanceBefore + holderAssets - gasUsed ) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq(0) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq(0) await snapshotGasCost(receipt) }) it('for single user in multiple checkpoints in multiple transactions', async () => { - const halfHolderAssets = holderAssets.div(2) - const halfHolderShares = holderShares.div(2) + const halfHolderAssets = holderAssets / 2n + const halfHolderShares = holderShares / 2n // create first checkpoint - await setBalance(vault.address, halfHolderAssets) + await setBalance(await vault.getAddress(), halfHolderAssets) await expect(vault.updateState(harvestParams)) .to.emit(vault, 'CheckpointCreated') .withArgs(halfHolderShares, halfHolderAssets) @@ -515,23 +512,25 @@ describe('EthVault - withdraw', () => { .connect(receiver) .claimExitedAssets(positionTicket, timestamp, checkpointIndex) - const newPositionTicket = validatorDeposit.add(halfHolderShares) + const newPositionTicket = validatorDeposit + halfHolderShares await expect(receipt) .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(receiver.address, positionTicket, newPositionTicket, halfHolderAssets) - let tx = await receipt.wait() - let gasUsed = tx.effectiveGasPrice.mul(tx.cumulativeGasUsed) - expect(await waffle.provider.getBalance(receiver.address)).to.be.eq( - receiverBalanceBefore.add(halfHolderAssets).sub(gasUsed) + let tx = (await receipt.wait()) as any + let gasUsed = BigInt(tx.cumulativeGasUsed * tx.gasPrice) + expect(await ethers.provider.getBalance(receiver.address)).to.be.eq( + receiverBalanceBefore + halfHolderAssets - gasUsed ) await snapshotGasCost(receipt) // create second checkpoint await increaseTime(ONE_DAY) - await setBalance(vault.address, halfHolderAssets) - await updateRewards(keeper, [{ vault: vault.address, reward: 0, unlockedMevReward: 0 }]) + await setBalance(await vault.getAddress(), halfHolderAssets) + await updateRewards(keeper, [ + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, + ]) await expect(vault.updateState(harvestParams)) .to.emit(vault, 'CheckpointCreated') .withArgs(halfHolderShares, halfHolderAssets) @@ -544,12 +543,12 @@ describe('EthVault - withdraw', () => { .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(receiver.address, newPositionTicket, 0, halfHolderAssets) - tx = await receipt.wait() - gasUsed = gasUsed.add(tx.effectiveGasPrice.mul(tx.cumulativeGasUsed)) - expect(await waffle.provider.getBalance(receiver.address)).to.be.eq( - receiverBalanceBefore.add(holderAssets).sub(gasUsed) + tx = (await receipt.wait()) as any + gasUsed += BigInt(tx.cumulativeGasUsed * tx.gasPrice) + expect(await ethers.provider.getBalance(receiver.address)).to.be.eq( + receiverBalanceBefore + holderAssets - gasUsed ) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq(0) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq(0) await snapshotGasCost(receipt) }) @@ -570,22 +569,22 @@ describe('EthVault - withdraw', () => { await vault.connect(user2).deposit(user2.address, referrer, { value: assets }) let response = await vault.connect(user1).enterExitQueue(shares, user1.address) - let receipt = await response.wait() - const user1PositionTicket = extractExitPositionTicket(receipt) - const user1Timestamp = await getBlockTimestamp(receipt) - const user1BalanceBefore = await waffle.provider.getBalance(user1.address) + const user1PositionTicket = await extractExitPositionTicket(response) + const user1Timestamp = await getBlockTimestamp(response) + const user1BalanceBefore = await ethers.provider.getBalance(user1.address) response = await vault.connect(user2).enterExitQueue(shares, user2.address) - receipt = await response.wait() - const user2PositionTicket = extractExitPositionTicket(receipt) - const user2Timestamp = await getBlockTimestamp(receipt) - const user2BalanceBefore = await waffle.provider.getBalance(user2.address) + const user2PositionTicket = await extractExitPositionTicket(response) + const user2Timestamp = await getBlockTimestamp(response) + const user2BalanceBefore = await ethers.provider.getBalance(user2.address) await increaseTime(ONE_DAY) - await updateRewards(keeper, [{ vault: vault.address, reward: 0, unlockedMevReward: 0 }]) + await updateRewards(keeper, [ + { vault: await vault.getAddress(), reward: 0n, unlockedMevReward: 0n }, + ]) await expect(vault.connect(other).updateState(harvestParams)) .to.emit(vault, 'CheckpointCreated') - .withArgs(shares.mul(2), assets.mul(2)) + .withArgs(shares * 2n, assets * 2n) await increaseTime(EXITING_ASSETS_MIN_DELAY) response = await vault @@ -599,10 +598,10 @@ describe('EthVault - withdraw', () => { .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(user2.address, user2PositionTicket, 0, assets) - receipt = await response.wait() - let gasUsed = receipt.effectiveGasPrice.mul(receipt.cumulativeGasUsed) - expect(await waffle.provider.getBalance(user2.address)).to.be.eq( - user2BalanceBefore.add(assets).sub(gasUsed) + let tx = (await response.wait()) as any + let gasUsed = BigInt(tx.cumulativeGasUsed * tx.gasPrice) + expect(await ethers.provider.getBalance(user2.address)).to.be.eq( + user2BalanceBefore + assets - gasUsed ) response = await vault @@ -616,12 +615,12 @@ describe('EthVault - withdraw', () => { .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(user1.address, user1PositionTicket, 0, assets) - receipt = await response.wait() - gasUsed = receipt.effectiveGasPrice.mul(receipt.cumulativeGasUsed) - expect(await waffle.provider.getBalance(user1.address)).to.be.eq( - user1BalanceBefore.add(assets).sub(gasUsed) + tx = (await response.wait()) as any + gasUsed = BigInt(tx.cumulativeGasUsed * tx.gasPrice) + expect(await ethers.provider.getBalance(user1.address)).to.be.eq( + user1BalanceBefore + assets - gasUsed ) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq(SECURITY_DEPOSIT) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq(SECURITY_DEPOSIT) }) }) @@ -642,18 +641,18 @@ describe('EthVault - withdraw', () => { await vault._setTotalAssets(0) await vault._setTotalShares(0) - let aliceShares = 0 - let aliceAssets = 0 - let bobShares = 0 - let bobAssets = 0 - let totalAssets = 0 - let totalShares = 0 - let queuedShares = 0 - let unclaimedAssets = 0 + let aliceShares = 0n + let aliceAssets = 0n + let bobShares = 0n + let bobAssets = 0n + let totalAssets = 0n + let totalShares = 0n + let queuedShares = 0n + let unclaimedAssets = 0n let latestPositionTicket = validatorDeposit - let vaultLiquidAssets = 0 - let totalReward = 0 - let totalUnlockedMevReward = 0 + let vaultLiquidAssets = 0n + let totalReward = 0n + let totalUnlockedMevReward = 0n const checkVaultState = async () => { expect(await vault.getShares(alice.address)).to.be.eq(aliceShares) @@ -661,89 +660,97 @@ describe('EthVault - withdraw', () => { expect(await vault.convertToAssets(aliceShares)).to.be.eq(aliceAssets) expect(await vault.convertToAssets(bobShares)).to.be.eq(bobAssets) expect(await vault.totalShares()).to.be.eq(totalShares) - expect(await waffle.provider.getBalance(sharedMevEscrow.address)).to.be.eq(0) - expect(await waffle.provider.getBalance(vault.address)).to.be.eq(vaultLiquidAssets) + expect(await ethers.provider.getBalance(await sharedMevEscrow.getAddress())).to.be.eq(0) + expect(await ethers.provider.getBalance(await vault.getAddress())).to.be.eq(vaultLiquidAssets) expect(await vault.totalAssets()).to.be.eq(totalAssets) expect(await vault.queuedShares()).to.be.eq(queuedShares) } // 1. Alice deposits 2000 ETH (mints 2000 shares) - aliceShares += 2000 - aliceAssets += 2000 - totalAssets += 2000 - vaultLiquidAssets += 2000 - totalShares += 2000 + aliceShares += 2000n + aliceAssets += 2000n + totalAssets += 2000n + vaultLiquidAssets += 2000n + totalShares += 2000n await vault.connect(alice).deposit(alice.address, referrer, { value: aliceAssets }) await checkVaultState() // 2. Bob deposits 4000 ETH (mints 4000 shares) - bobShares += 4000 - bobAssets += 4000 - totalAssets += 4000 - vaultLiquidAssets += 4000 - totalShares += 4000 + bobShares += 4000n + bobAssets += 4000n + totalAssets += 4000n + vaultLiquidAssets += 4000n + totalShares += 4000n await vault.connect(bob).deposit(bob.address, referrer, { value: bobAssets }) await checkVaultState() // 3. Vault mutates by +3000 ETH (40% from validators, 60% from priority fees) - totalAssets += 3000 - totalReward += 3000 - vaultLiquidAssets += 1800 - totalUnlockedMevReward += 1800 + totalAssets += 3000n + totalReward += 3000n + vaultLiquidAssets += 1800n + totalUnlockedMevReward += 1800n let tree = await updateRewards(keeper, [ - { vault: vault.address, reward: totalReward, unlockedMevReward: totalUnlockedMevReward }, + { + vault: await vault.getAddress(), + reward: totalReward, + unlockedMevReward: totalUnlockedMevReward, + }, ]) let proof = getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: totalUnlockedMevReward, }) - await setBalance(sharedMevEscrow.address, BigNumber.from(1800)) + await setBalance(await sharedMevEscrow.getAddress(), 1800n) await vault.updateState({ rewardsRoot: tree.root, reward: totalReward, unlockedMevReward: totalUnlockedMevReward, proof, }) - aliceAssets += 1000 - bobAssets += 2000 + aliceAssets += 1000n + bobAssets += 2000n await checkVaultState() // 4. Alice deposits 2000 ETH (mints 1334 shares) - aliceShares += 1334 - aliceAssets += 2000 - bobAssets -= 1 // rounding error - totalAssets += 2000 - vaultLiquidAssets += 2000 - totalShares += 1334 + aliceShares += 1334n + aliceAssets += 2000n + bobAssets -= 1n // rounding error + totalAssets += 2000n + vaultLiquidAssets += 2000n + totalShares += 1334n await vault.connect(alice).deposit(alice.address, referrer, { value: 2000 }) await checkVaultState() // 5. Bob deposits 3000 ETH (mints 2000 shares) await vault.connect(bob).deposit(bob.address, referrer, { value: 3000 }) - bobShares += 2001 // rounds up - bobAssets += 3000 - totalAssets += 3000 - vaultLiquidAssets += 3000 - totalShares += 2001 + bobShares += 2001n // rounds up + bobAssets += 3000n + totalAssets += 3000n + vaultLiquidAssets += 3000n + totalShares += 2001n await checkVaultState() // 6. Vault mutates by +3000 shares - totalAssets += 3000 - totalReward += 3000 - vaultLiquidAssets += 1800 - totalUnlockedMevReward += 1800 - await setBalance(sharedMevEscrow.address, BigNumber.from(1800)) + totalAssets += 3000n + totalReward += 3000n + vaultLiquidAssets += 1800n + totalUnlockedMevReward += 1800n + await setBalance(await sharedMevEscrow.getAddress(), 1800n) tree = await updateRewards(keeper, [ - { vault: vault.address, reward: totalReward, unlockedMevReward: totalUnlockedMevReward }, + { + vault: await vault.getAddress(), + reward: totalReward, + unlockedMevReward: totalUnlockedMevReward, + }, ]) proof = getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: totalUnlockedMevReward, }) @@ -754,20 +761,23 @@ describe('EthVault - withdraw', () => { proof, }) - aliceAssets += 1071 - bobAssets += 1929 + aliceAssets += 1071n + bobAssets += 1929n await checkVaultState() // 7. Alice enters exit queue with 1333 shares (2427 assets) let response = await vault.connect(alice).enterExitQueue(1333, alice.address) - let receipt = await response.wait() - let alicePositionTicket = extractExitPositionTicket(receipt) - let aliceTimestamp = await getBlockTimestamp(receipt) + let alicePositionTicket = await extractExitPositionTicket(response) + let aliceTimestamp = await getBlockTimestamp(response) // alice withdraws assets await updateRewards(keeper, [ - { vault: vault.address, reward: totalReward, unlockedMevReward: totalUnlockedMevReward }, + { + vault: await vault.getAddress(), + reward: totalReward, + unlockedMevReward: totalUnlockedMevReward, + }, ]) await vault.updateState({ rewardsRoot: tree.root, @@ -784,26 +794,29 @@ describe('EthVault - withdraw', () => { await vault.getExitQueueIndex(alicePositionTicket) ) - aliceShares -= 1333 - aliceAssets -= 2428 - bobAssets -= 1 // rounding error - totalAssets -= 2427 - vaultLiquidAssets -= 2427 - totalShares -= 1332 + aliceShares -= 1333n + aliceAssets -= 2428n + bobAssets -= 1n // rounding error + totalAssets -= 2427n + vaultLiquidAssets -= 2427n + totalShares -= 1332n expect(alicePositionTicket).to.eq(latestPositionTicket) - latestPositionTicket = validatorDeposit.add(1333) - queuedShares += 1 + latestPositionTicket = validatorDeposit + 1333n + queuedShares += 1n await checkVaultState() // 8. Bob enters exit queue with 1608 assets (2928 shares) response = await vault.connect(bob).enterExitQueue(1608, bob.address) - receipt = await response.wait() - let bobPositionTicket = extractExitPositionTicket(receipt) - let bobTimestamp = await getBlockTimestamp(receipt) + let bobPositionTicket = await extractExitPositionTicket(response) + let bobTimestamp = await getBlockTimestamp(response) await updateRewards(keeper, [ - { vault: vault.address, reward: totalReward, unlockedMevReward: totalUnlockedMevReward }, + { + vault: await vault.getAddress(), + reward: totalReward, + unlockedMevReward: totalUnlockedMevReward, + }, ]) await vault.updateState({ rewardsRoot: tree.root, @@ -827,58 +840,60 @@ describe('EthVault - withdraw', () => { await vault.getExitQueueIndex(bobPositionTicket) ) - bobShares -= 1608 - bobAssets -= 2929 - totalAssets -= 2929 - vaultLiquidAssets -= 2927 - totalShares -= 1608 + bobShares -= 1608n + bobAssets -= 2929n + totalAssets -= 2929n + vaultLiquidAssets -= 2927n + totalShares -= 1608n expect(bobPositionTicket).to.eq(latestPositionTicket) - latestPositionTicket = latestPositionTicket.add(1608) + latestPositionTicket = latestPositionTicket + 1608n await checkVaultState() // 9. Most the Vault's assets are staked - vaultLiquidAssets = 2600 - await setBalance(vault.address, BigNumber.from(2600)) + vaultLiquidAssets = 2600n + await setBalance(await vault.getAddress(), 2600n) // 10. Alice enters exit queue with 1000 shares response = await vault.connect(alice).enterExitQueue(1000, alice.address) - receipt = await response.wait() - alicePositionTicket = extractExitPositionTicket(receipt) - aliceTimestamp = await getBlockTimestamp(receipt) + alicePositionTicket = await extractExitPositionTicket(response) + aliceTimestamp = await getBlockTimestamp(response) await expect(response) .to.emit(vault, 'ExitQueueEntered') .withArgs(alice.address, alice.address, alicePositionTicket, 1000) - aliceShares -= 1000 // rounding error - aliceAssets -= 1821 - queuedShares += 1000 + aliceShares -= 1000n // rounding error + aliceAssets -= 1821n + queuedShares += 1000n expect(alicePositionTicket).to.eq(latestPositionTicket) - latestPositionTicket = latestPositionTicket.add(1000) + latestPositionTicket = latestPositionTicket + 1000n await checkVaultState() // 11. Bob enters exit queue with 4393 shares - response = await vault.connect(bob).enterExitQueue(4393, bob.address) - receipt = await response.wait() - bobPositionTicket = extractExitPositionTicket(receipt) - bobTimestamp = await getBlockTimestamp(receipt) + response = await vault.connect(bob).enterExitQueue(4393n, bob.address) + bobPositionTicket = await extractExitPositionTicket(response) + bobTimestamp = await getBlockTimestamp(response) await expect(response) .to.emit(vault, 'ExitQueueEntered') .withArgs(bob.address, bob.address, bobPositionTicket, 4393) - bobShares -= 4393 - bobAssets -= 7998 - queuedShares += 4393 + bobShares -= 4393n + bobAssets -= 7998n + queuedShares += 4393n expect(bobPositionTicket).to.eq(latestPositionTicket) - latestPositionTicket = latestPositionTicket.add(4393) + latestPositionTicket = latestPositionTicket + 4393n await checkVaultState() // 12. Update exit queue and transfer not staked assets to Bob and Alice await updateRewards(keeper, [ - { vault: vault.address, reward: totalReward, unlockedMevReward: totalUnlockedMevReward }, + { + vault: await vault.getAddress(), + reward: totalReward, + unlockedMevReward: totalUnlockedMevReward, + }, ]) await expect( vault.updateState({ @@ -891,29 +906,33 @@ describe('EthVault - withdraw', () => { .to.emit(vault, 'CheckpointCreated') .withArgs(1426, 2598) - totalAssets -= 2598 - totalShares -= 1426 - queuedShares -= 1426 - unclaimedAssets += 2598 + totalAssets -= 2598n + totalShares -= 1426n + queuedShares -= 1426n + unclaimedAssets += 2598n await checkVaultState() // 13. Vault mutates by +5000 shares - totalAssets += 5000 - totalReward += 5000 - vaultLiquidAssets += 3000 - totalUnlockedMevReward += 3000 + totalAssets += 5000n + totalReward += 5000n + vaultLiquidAssets += 3000n + totalUnlockedMevReward += 3000n tree = await updateRewards(keeper, [ - { vault: vault.address, reward: totalReward, unlockedMevReward: totalUnlockedMevReward }, + { + vault: await vault.getAddress(), + reward: totalReward, + unlockedMevReward: totalUnlockedMevReward, + }, ]) - await setBalance(sharedMevEscrow.address, BigNumber.from(3000)) + await setBalance(await sharedMevEscrow.getAddress(), 3000n) await expect( vault.updateState({ rewardsRoot: tree.root, reward: totalReward, unlockedMevReward: totalUnlockedMevReward, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: totalUnlockedMevReward, }), @@ -923,11 +942,11 @@ describe('EthVault - withdraw', () => { .withArgs(1061, 3000) // update alice assets - aliceAssets += 1007 - totalShares -= 1061 - totalAssets -= 3000 - queuedShares -= 1061 - unclaimedAssets += 3000 + aliceAssets += 1007n + totalShares -= 1061n + totalAssets -= 3000n + queuedShares -= 1061n + unclaimedAssets += 3000n await checkVaultState() // 14. Bob claims exited assets @@ -936,11 +955,11 @@ describe('EthVault - withdraw', () => { vault.connect(bob).claimExitedAssets(bobPositionTicket, bobTimestamp, bobCheckpointIdx) ) .to.emit(vault, 'ExitedAssetsClaimed') - .withArgs(bob.address, bobPositionTicket, bobPositionTicket.add(1486), 3774) + .withArgs(bob.address, bobPositionTicket, bobPositionTicket + 1486n, 3774n) - bobPositionTicket = bobPositionTicket.add(1486) - vaultLiquidAssets -= 3774 - unclaimedAssets -= 3774 + bobPositionTicket = bobPositionTicket + 1486n + vaultLiquidAssets -= 3774n + unclaimedAssets -= 3774n await checkVaultState() // 15. Alice claims exited assets @@ -953,30 +972,33 @@ describe('EthVault - withdraw', () => { .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(alice.address, alicePositionTicket, 0, 1821) - vaultLiquidAssets -= 1821 - unclaimedAssets -= 1821 + vaultLiquidAssets -= 1821n + unclaimedAssets -= 1821n await checkVaultState() // 16. Alice enters exit queue with 1001 shares response = await vault.connect(alice).enterExitQueue(1001, alice.address) - receipt = await response.wait() - alicePositionTicket = extractExitPositionTicket(receipt) - aliceTimestamp = await getBlockTimestamp(receipt) + alicePositionTicket = await extractExitPositionTicket(response) + aliceTimestamp = await getBlockTimestamp(response) await expect(response) .to.emit(vault, 'ExitQueueEntered') .withArgs(alice.address, alice.address, alicePositionTicket, 1001) expect(alicePositionTicket).to.be.eq(latestPositionTicket) - queuedShares += 1001 - aliceShares -= 1001 - aliceAssets -= 2829 + queuedShares += 1001n + aliceShares -= 1001n + aliceAssets -= 2829n await checkVaultState() // 17. Withdrawal of all the assets arrives await increaseTime(ONE_DAY) - await setBalance(vault.address, BigNumber.from(totalAssets + unclaimedAssets + 2)) + await setBalance(await vault.getAddress(), totalAssets + unclaimedAssets + 2n) await updateRewards(keeper, [ - { vault: vault.address, reward: totalReward, unlockedMevReward: totalUnlockedMevReward }, + { + vault: await vault.getAddress(), + reward: totalReward, + unlockedMevReward: totalUnlockedMevReward, + }, ]) await expect( vault.updateState({ @@ -987,11 +1009,11 @@ describe('EthVault - withdraw', () => { }) ).to.emit(vault, 'CheckpointCreated') - unclaimedAssets += totalAssets + 2 + unclaimedAssets += totalAssets + 2n vaultLiquidAssets = unclaimedAssets - totalShares = 0 - queuedShares = 0 - totalAssets = 0 + totalShares = 0n + queuedShares = 0n + totalAssets = 0n await checkVaultState() @@ -1004,7 +1026,7 @@ describe('EthVault - withdraw', () => { .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(bob.address, bobPositionTicket, 0, 8216) - vaultLiquidAssets -= 8216 + vaultLiquidAssets -= 8216n await checkVaultState() // 19. Alice claims exited assets @@ -1017,18 +1039,18 @@ describe('EthVault - withdraw', () => { ) .to.emit(vault, 'ExitedAssetsClaimed') .withArgs(alice.address, alicePositionTicket, 0, 2829) - vaultLiquidAssets -= 2829 + vaultLiquidAssets -= 2829n await checkVaultState() // 20. Check whether state is correct - aliceShares = 0 - aliceAssets = 0 - bobShares = 0 - bobAssets = 0 - totalAssets = 0 - totalShares = 0 - queuedShares = 0 - vaultLiquidAssets = 6 + aliceShares = 0n + aliceAssets = 0n + bobShares = 0n + bobAssets = 0n + totalAssets = 0n + totalShares = 0n + queuedShares = 0n + vaultLiquidAssets = 6n await checkVaultState() }) }) diff --git a/test/EthVaultFactory.spec.ts b/test/EthVaultFactory.spec.ts index 32127e49..c75ecfe2 100644 --- a/test/EthVaultFactory.spec.ts +++ b/test/EthVaultFactory.spec.ts @@ -1,6 +1,6 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Wallet } from 'ethers' -import { hexlify, parseEther } from 'ethers/lib/utils' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthVaultFactory, SharedMevEscrow, VaultsRegistry } from '../typechain-types' import snapshotGasCost from './shared/snapshotGasCost' import { expect } from './shared/expect' @@ -10,13 +10,11 @@ import { ethVaultFixture, } from './shared/fixtures' import { SECURITY_DEPOSIT, ZERO_ADDRESS, ZERO_BYTES32 } from './shared/constants' -import { extractMevEscrowAddress, extractVaultAddress } from './shared/utils' +import { extractMevEscrowAddress, extractVaultAddress, toHexString } from './shared/utils' import keccak256 from 'keccak256' -const createFixtureLoader = waffle.createFixtureLoader - describe('EthVaultFactory', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const name = 'SW ETH Vault' const symbol = 'SW-ETH-1' @@ -36,7 +34,7 @@ describe('EthVaultFactory', () => { metadataIpfsHash, } const ethErc20VaultInitParamsEncoded = encodeEthErc20VaultInitParams(ethErc20VaultInitParams) - let admin: Wallet, owner: Wallet + let admin: Wallet let ethVaultFactory: EthVaultFactory, ethPrivVaultFactory: EthVaultFactory, ethErc20VaultFactory: EthVaultFactory, @@ -44,14 +42,8 @@ describe('EthVaultFactory', () => { let sharedMevEscrow: SharedMevEscrow let vaultsRegistry: VaultsRegistry - let loadFixture: ReturnType - - before('create fixture loader', async () => { - ;[owner, admin] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) - }) - beforeEach(async () => { + ;[admin] = (await (ethers as any).getSigners()).slice(1, 2) ;({ ethVaultFactory, ethPrivVaultFactory, @@ -146,16 +138,15 @@ describe('EthVaultFactory', () => { : encodeEthVaultInitParams(ethVaultInitParams) // fails without security deposit - await expect( - factory.connect(admin).createVault(initParamsEncoded, isOwnEscrow) - ).to.revertedWith('InvalidSecurityDeposit') + await expect(factory.connect(admin).createVault(initParamsEncoded, isOwnEscrow)).to.reverted const tx = await factory .connect(admin) .createVault(initParamsEncoded, isOwnEscrow, { value: SECURITY_DEPOSIT }) - const receipt = await tx.wait() - const vaultAddress = extractVaultAddress(receipt) - const mevEscrow = isOwnEscrow ? extractMevEscrowAddress(receipt) : sharedMevEscrow.address + const vaultAddress = await extractVaultAddress(tx) + const mevEscrow = isOwnEscrow + ? await extractMevEscrowAddress(tx) + : await sharedMevEscrow.getAddress() await expect(tx) .to.emit(factory, 'VaultCreated') @@ -171,7 +162,7 @@ describe('EthVaultFactory', () => { await expect(tx) .to.emit(vaultsRegistry, 'VaultAdded') - .withArgs(factory.address, vaultAddress) + .withArgs(await factory.getAddress(), vaultAddress) await expect(vault.connect(admin).initialize(ZERO_BYTES32)).to.revertedWith( 'Initializable: contract is already initialized' ) @@ -193,11 +184,11 @@ describe('EthVaultFactory', () => { expect(await vault.admin()).to.be.eq(admin.address) await expect(tx) .to.emit(vault, 'MetadataUpdated') - .withArgs(factory.address, metadataIpfsHash) + .withArgs(await factory.getAddress(), metadataIpfsHash) // VaultVersion expect(await vault.version()).to.be.eq(1) - expect(await vault.vaultId()).to.be.eq(hexlify(keccak256(vaultClass))) + expect(await vault.vaultId()).to.be.eq(toHexString(keccak256(vaultClass))) expect(await factory.implementation()).to.be.eq(await vault.implementation()) // VaultFee @@ -205,7 +196,7 @@ describe('EthVaultFactory', () => { expect(await vault.feePercent()).to.be.eq(feePercent) await expect(tx) .to.emit(vault, 'FeeRecipientUpdated') - .withArgs(factory.address, admin.address) + .withArgs(await factory.getAddress(), admin.address) // VaultMev expect(await vault.mevEscrow()).to.be.eq(mevEscrow) @@ -215,7 +206,7 @@ describe('EthVaultFactory', () => { await expect(await vault.whitelister()).to.be.eq(admin.address) await expect(tx) .to.emit(vault, 'WhitelisterUpdated') - .withArgs(factory.address, admin.address) + .withArgs(await factory.getAddress(), admin.address) } } } diff --git a/test/KeeperOracles.spec.ts b/test/KeeperOracles.spec.ts index 6be567e1..c631cf7b 100644 --- a/test/KeeperOracles.spec.ts +++ b/test/KeeperOracles.spec.ts @@ -1,4 +1,5 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { Wallet } from 'ethers' import { Keeper } from '../typechain-types' import { ethVaultFixture } from './shared/fixtures' @@ -6,24 +7,16 @@ import { expect } from './shared/expect' import snapshotGasCost from './shared/snapshotGasCost' import { ORACLES, ORACLES_CONFIG } from './shared/constants' -const createFixtureLoader = waffle.createFixtureLoader - describe('KeeperOracles', () => { const maxOracles = 30 - let owner: Wallet, oracle: Wallet, other: Wallet + let dao: Wallet, oracle: Wallet, other: Wallet let keeper: Keeper let totalOracles: number - let loadFixture: ReturnType - - before('create fixture loader', async () => { - ;[owner, oracle, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) - }) - beforeEach('deploy fixture', async () => { + ;[dao, oracle, other] = await (ethers as any).getSigners() ;({ keeper } = await loadFixture(ethVaultFixture)) - totalOracles = (await keeper.totalOracles()).toNumber() + totalOracles = Number(await keeper.totalOracles()) }) describe('add oracle', () => { @@ -34,21 +27,24 @@ describe('KeeperOracles', () => { }) it('fails if already added', async () => { - await keeper.connect(owner).addOracle(oracle.address) - await expect(keeper.connect(owner).addOracle(oracle.address)).revertedWith('AlreadyAdded') + await keeper.connect(dao).addOracle(oracle.address) + await expect(keeper.connect(dao).addOracle(oracle.address)).revertedWithCustomError( + keeper, + 'AlreadyAdded' + ) }) it('fails when number of oracles exceeded', async () => { for (let i = 0; i < maxOracles - ORACLES.length; i++) { - await keeper.connect(owner).addOracle(ethers.Wallet.createRandom().address) + await keeper.connect(dao).addOracle(ethers.Wallet.createRandom().address) } await expect( - keeper.connect(owner).addOracle(ethers.Wallet.createRandom().address) - ).revertedWith('MaxOraclesExceeded') + keeper.connect(dao).addOracle(ethers.Wallet.createRandom().address) + ).revertedWithCustomError(keeper, 'MaxOraclesExceeded') }) it('succeeds', async () => { - const receipt = await keeper.connect(owner).addOracle(oracle.address) + const receipt = await keeper.connect(dao).addOracle(oracle.address) await expect(receipt).to.emit(keeper, 'OracleAdded').withArgs(oracle.address) expect(await keeper.isOracle(oracle.address)).to.be.eq(true) expect(await keeper.totalOracles()).to.be.eq(totalOracles + 1) @@ -60,8 +56,8 @@ describe('KeeperOracles', () => { let totalOracles: number beforeEach(async () => { - await keeper.connect(owner).addOracle(oracle.address) - totalOracles = (await keeper.totalOracles()).toNumber() + await keeper.connect(dao).addOracle(oracle.address) + totalOracles = Number(await keeper.totalOracles()) }) it('fails if not owner', async () => { @@ -71,14 +67,15 @@ describe('KeeperOracles', () => { }) it('fails if already removed', async () => { - await keeper.connect(owner).removeOracle(oracle.address) - await expect(keeper.connect(owner).removeOracle(oracle.address)).revertedWith( + await keeper.connect(dao).removeOracle(oracle.address) + await expect(keeper.connect(dao).removeOracle(oracle.address)).revertedWithCustomError( + keeper, 'AlreadyRemoved' ) }) it('succeeds', async () => { - const receipt = await keeper.connect(owner).removeOracle(oracle.address) + const receipt = await keeper.connect(dao).removeOracle(oracle.address) await expect(receipt).to.emit(keeper, 'OracleRemoved').withArgs(oracle.address) expect(await keeper.isOracle(oracle.address)).to.be.eq(false) expect(await keeper.totalOracles()).to.be.eq(totalOracles - 1) @@ -94,7 +91,7 @@ describe('KeeperOracles', () => { }) it('succeeds', async () => { - const receipt = await keeper.connect(owner).updateConfig(ORACLES_CONFIG) + const receipt = await keeper.connect(dao).updateConfig(ORACLES_CONFIG) await expect(receipt).to.emit(keeper, 'ConfigUpdated').withArgs(ORACLES_CONFIG) await snapshotGasCost(receipt) }) diff --git a/test/KeeperRewards.spec.ts b/test/KeeperRewards.spec.ts index 4852d7d9..29e2bcc3 100644 --- a/test/KeeperRewards.spec.ts +++ b/test/KeeperRewards.spec.ts @@ -1,6 +1,6 @@ -import { ethers, waffle } from 'hardhat' -import { BigNumber, Contract, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { ethers } from 'hardhat' +import { Contract, Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthVault, IKeeperRewards, Keeper, OsToken, SharedMevEscrow } from '../typechain-types' import { ThenArg } from '../helpers/types' import { ethVaultFixture, getOraclesSignatures } from './shared/fixtures' @@ -15,32 +15,24 @@ import { } from './shared/constants' import snapshotGasCost from './shared/snapshotGasCost' import { getKeeperRewardsUpdateData, getRewardsRootProof, VaultReward } from './shared/rewards' -import { increaseTime, setBalance } from './shared/utils' +import { increaseTime, setBalance, toHexString } from './shared/utils' import { registerEthValidator } from './shared/validators' -const createFixtureLoader = waffle.createFixtureLoader - describe('KeeperRewards', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] - let owner: Wallet, admin: Wallet, oracle: Wallet, other: Wallet + let dao: Wallet, admin: Wallet, oracle: Wallet, other: Wallet let keeper: Keeper, validatorsRegistry: Contract, sharedMevEscrow: SharedMevEscrow, osToken: OsToken - before('create fixture loader', async () => { - ;[admin, owner, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) - oracle = new Wallet(ORACLES[0], await waffle.provider) - }) - beforeEach(async () => { + ;[dao, admin, oracle, other] = await (ethers as any).getSigners() ;({ keeper, createEthVault: createVault, @@ -48,7 +40,7 @@ describe('KeeperRewards', () => { sharedMevEscrow, osToken, } = await loadFixture(ethVaultFixture)) - await setBalance(oracle.address, parseEther('10000')) + await setBalance(oracle.address, ethers.parseEther('10000')) }) describe('update rewards', () => { @@ -63,11 +55,11 @@ describe('KeeperRewards', () => { metadataIpfsHash, }) vaultReward = { - reward: parseEther('5'), - unlockedMevReward: parseEther('1'), - vault: vault.address, + reward: ethers.parseEther('5'), + unlockedMevReward: ethers.parseEther('1'), + vault: await vault.getAddress(), } - const rewardsUpdate = getKeeperRewardsUpdateData([vaultReward], keeper) + const rewardsUpdate = await getKeeperRewardsUpdateData([vaultReward], keeper) rewardsUpdateParams = { rewardsRoot: rewardsUpdate.root, updateTimestamp: rewardsUpdate.updateTimestamp, @@ -82,7 +74,7 @@ describe('KeeperRewards', () => { keeper .connect(oracle) .updateRewards({ ...rewardsUpdateParams, rewardsIpfsHash: ZERO_BYTES32 }) - ).to.be.revertedWith('InvalidOracle') + ).to.be.revertedWithCustomError(keeper, 'InvalidOracle') }) it('fails with invalid avgRewardPerSecond', async () => { @@ -91,18 +83,18 @@ describe('KeeperRewards', () => { ...rewardsUpdateParams, avgRewardPerSecond: MAX_AVG_REWARD_PER_SECOND + 1, }) - ).to.be.revertedWith('InvalidAvgRewardPerSecond') + ).to.be.revertedWithCustomError(keeper, 'InvalidAvgRewardPerSecond') }) it('fails with invalid nonce', async () => { await keeper.connect(oracle).updateRewards(rewardsUpdateParams) const newVaultReward = { - reward: parseEther('3'), - unlockedMevReward: parseEther('2'), - vault: vault.address, + reward: ethers.parseEther('3'), + unlockedMevReward: ethers.parseEther('2'), + vault: await vault.getAddress(), } - const newRewardsUpdate = getKeeperRewardsUpdateData([newVaultReward], keeper) + const newRewardsUpdate = await getKeeperRewardsUpdateData([newVaultReward], keeper) await increaseTime(REWARDS_DELAY) await expect( keeper.connect(oracle).updateRewards({ @@ -112,19 +104,19 @@ describe('KeeperRewards', () => { avgRewardPerSecond: newRewardsUpdate.avgRewardPerSecond, signatures: getOraclesSignatures(newRewardsUpdate.signingData), }) - ).to.be.revertedWith('InvalidOracle') + ).to.be.revertedWithCustomError(keeper, 'InvalidOracle') }) it('fails if too early', async () => { await keeper.connect(oracle).updateRewards(rewardsUpdateParams) const newVaultReward = { - reward: parseEther('5'), - unlockedMevReward: parseEther('1'), - vault: vault.address, + reward: ethers.parseEther('5'), + unlockedMevReward: ethers.parseEther('1'), + vault: await vault.getAddress(), } - const newRewardsUpdate = getKeeperRewardsUpdateData([newVaultReward], keeper, { + const newRewardsUpdate = await getKeeperRewardsUpdateData([newVaultReward], keeper, { nonce: 2, - updateTimestamp: '1680255895', + updateTimestamp: 1680255895, }) expect(await keeper.canUpdateRewards()).to.eq(false) await expect( @@ -135,22 +127,23 @@ describe('KeeperRewards', () => { avgRewardPerSecond: newRewardsUpdate.avgRewardPerSecond, signatures: getOraclesSignatures(newRewardsUpdate.signingData), }) - ).to.be.revertedWith('TooEarlyUpdate') + ).to.be.revertedWithCustomError(keeper, 'TooEarlyUpdate') }) it('fails with invalid number of oracle signatures', async () => { - const rewardsUpdate = getKeeperRewardsUpdateData([vaultReward], keeper) + const rewardsUpdate = await getKeeperRewardsUpdateData([vaultReward], keeper) const params = { ...rewardsUpdateParams, signatures: getOraclesSignatures(rewardsUpdate.signingData, REWARDS_MIN_ORACLES - 1), } - await expect(keeper.connect(oracle).updateRewards(params)).to.be.revertedWith( + await expect(keeper.connect(oracle).updateRewards(params)).to.be.revertedWithCustomError( + keeper, 'NotEnoughSignatures' ) }) it('fails with repeated signature', async () => { - const rewardsUpdate = getKeeperRewardsUpdateData([vaultReward], keeper) + const rewardsUpdate = await getKeeperRewardsUpdateData([vaultReward], keeper) const params = { ...rewardsUpdateParams, } @@ -158,20 +151,23 @@ describe('KeeperRewards', () => { getOraclesSignatures(rewardsUpdate.signingData, REWARDS_MIN_ORACLES - 1), getOraclesSignatures(rewardsUpdate.signingData, 1), ]) - await expect(keeper.connect(oracle).updateRewards(params)).to.be.revertedWith('InvalidOracle') + await expect(keeper.connect(oracle).updateRewards(params)).to.be.revertedWithCustomError( + keeper, + 'InvalidOracle' + ) }) it('fails with invalid oracle', async () => { await keeper - .connect(owner) - .removeOracle(new Wallet(ORACLES[1], await waffle.provider).address) - await expect(keeper.connect(oracle).updateRewards(rewardsUpdateParams)).to.be.revertedWith( - 'InvalidOracle' - ) + .connect(dao) + .removeOracle(new Wallet(toHexString(ORACLES[1]), ethers.provider).address) + await expect( + keeper.connect(oracle).updateRewards(rewardsUpdateParams) + ).to.be.revertedWithCustomError(keeper, 'InvalidOracle') }) it('succeeds with all signatures', async () => { - const rewardsUpdate = getKeeperRewardsUpdateData([vaultReward], keeper) + const rewardsUpdate = await getKeeperRewardsUpdateData([vaultReward], keeper) const params = { ...rewardsUpdateParams, signatures: getOraclesSignatures(rewardsUpdate.signingData, ORACLES.length), @@ -207,13 +203,13 @@ describe('KeeperRewards', () => { // check keeps previous rewards root const newVaultReward = { - reward: parseEther('3'), - unlockedMevReward: parseEther('2'), - vault: vault.address, + reward: ethers.parseEther('3'), + unlockedMevReward: ethers.parseEther('2'), + vault: await vault.getAddress(), } - const newRewardsUpdate = getKeeperRewardsUpdateData([newVaultReward], keeper, { + const newRewardsUpdate = await getKeeperRewardsUpdateData([newVaultReward], keeper, { nonce: 2, - updateTimestamp: '1670256000', + updateTimestamp: 1670256000, }) await increaseTime(REWARDS_DELAY) receipt = await keeper.connect(oracle).updateRewards({ @@ -252,31 +248,31 @@ describe('KeeperRewards', () => { }) it('returns false for uncollateralized vault', async () => { - expect(await keeper.isCollateralized(vault.address)).to.equal(false) - expect(await keeper.isHarvestRequired(vault.address)).to.equal(false) - expect(await keeper.canHarvest(vault.address)).to.equal(false) + expect(await keeper.isCollateralized(await vault.getAddress())).to.equal(false) + expect(await keeper.isHarvestRequired(await vault.getAddress())).to.equal(false) + expect(await keeper.canHarvest(await vault.getAddress())).to.equal(false) expect(await vault.isStateUpdateRequired()).to.equal(false) }) it('returns true for collateralized two times unharvested vault', async () => { // collateralize vault - const validatorDeposit = parseEther('32') + const validatorDeposit = ethers.parseEther('32') await vault.connect(admin).deposit(admin.address, ZERO_ADDRESS, { value: validatorDeposit }) await registerEthValidator(vault, keeper, validatorsRegistry, admin) - expect(await keeper.isCollateralized(vault.address)).to.equal(true) - expect(await keeper.canHarvest(vault.address)).to.equal(false) - expect(await keeper.isHarvestRequired(vault.address)).to.equal(false) + expect(await keeper.isCollateralized(await vault.getAddress())).to.equal(true) + expect(await keeper.canHarvest(await vault.getAddress())).to.equal(false) + expect(await keeper.isHarvestRequired(await vault.getAddress())).to.equal(false) expect(await vault.isStateUpdateRequired()).to.equal(false) // update rewards first time let newVaultReward = { - reward: parseEther('3'), - unlockedMevReward: parseEther('0.5'), - vault: vault.address, + reward: ethers.parseEther('3'), + unlockedMevReward: ethers.parseEther('0.5'), + vault: await vault.getAddress(), } - let newRewardsUpdate = getKeeperRewardsUpdateData([newVaultReward], keeper, { - updateTimestamp: '1670258895', + let newRewardsUpdate = await getKeeperRewardsUpdateData([newVaultReward], keeper, { + updateTimestamp: 1670258895, }) await keeper.connect(oracle).updateRewards({ rewardsRoot: newRewardsUpdate.root, @@ -287,21 +283,21 @@ describe('KeeperRewards', () => { signatures: getOraclesSignatures(newRewardsUpdate.signingData), }) - expect(await keeper.isCollateralized(vault.address)).to.equal(true) - expect(await keeper.canHarvest(vault.address)).to.equal(true) - expect(await keeper.isHarvestRequired(vault.address)).to.equal(false) + expect(await keeper.isCollateralized(await vault.getAddress())).to.equal(true) + expect(await keeper.canHarvest(await vault.getAddress())).to.equal(true) + expect(await keeper.isHarvestRequired(await vault.getAddress())).to.equal(false) expect(await vault.isStateUpdateRequired()).to.equal(false) // update rewards second time - const newTimestamp = BigNumber.from(newRewardsUpdate.updateTimestamp).add(1) + const newTimestamp = newRewardsUpdate.updateTimestamp + 1 newVaultReward = { - reward: parseEther('4'), - unlockedMevReward: parseEther('2'), - vault: vault.address, + reward: ethers.parseEther('4'), + unlockedMevReward: ethers.parseEther('2'), + vault: await vault.getAddress(), } - newRewardsUpdate = getKeeperRewardsUpdateData([newVaultReward], keeper, { + newRewardsUpdate = await getKeeperRewardsUpdateData([newVaultReward], keeper, { nonce: 2, - updateTimestamp: newTimestamp.toString(), + updateTimestamp: newTimestamp, }) await increaseTime(REWARDS_DELAY) await keeper.connect(oracle).updateRewards({ @@ -313,9 +309,9 @@ describe('KeeperRewards', () => { signatures: getOraclesSignatures(newRewardsUpdate.signingData), }) - expect(await keeper.isCollateralized(vault.address)).to.equal(true) - expect(await keeper.canHarvest(vault.address)).to.equal(true) - expect(await keeper.isHarvestRequired(vault.address)).to.equal(true) + expect(await keeper.isCollateralized(await vault.getAddress())).to.equal(true) + expect(await keeper.canHarvest(await vault.getAddress())).to.equal(true) + expect(await keeper.isHarvestRequired(await vault.getAddress())).to.equal(true) expect(await vault.isStateUpdateRequired()).to.equal(true) }) }) @@ -335,9 +331,9 @@ describe('KeeperRewards', () => { true ) const vaultReward = { - reward: parseEther('5'), - unlockedMevReward: 0, - vault: ownMevVault.address, + reward: ethers.parseEther('5'), + unlockedMevReward: 0n, + vault: await ownMevVault.getAddress(), } const vaultRewards = [vaultReward] for (let i = 1; i < 11; i++) { @@ -351,13 +347,13 @@ describe('KeeperRewards', () => { true ) vaultRewards.push({ - reward: parseEther(i.toString()), - unlockedMevReward: 0, - vault: vlt.address, + reward: ethers.parseEther(i.toString()), + unlockedMevReward: 0n, + vault: await vlt.getAddress(), }) } - const rewardsUpdate = getKeeperRewardsUpdateData(vaultRewards, keeper) + const rewardsUpdate = await getKeeperRewardsUpdateData(vaultRewards, keeper) await keeper.connect(oracle).updateRewards({ rewardsRoot: rewardsUpdate.root, updateTimestamp: rewardsUpdate.updateTimestamp, @@ -374,42 +370,45 @@ describe('KeeperRewards', () => { }) it('only vault can harvest', async () => { - await expect(keeper.harvest(harvestParams)).to.be.revertedWith('AccessDenied') + await expect(keeper.harvest(harvestParams)).to.be.revertedWithCustomError( + keeper, + 'AccessDenied' + ) }) it('fails for invalid reward', async () => { - await expect(ownMevVault.updateState({ ...harvestParams, reward: 0 })).to.be.revertedWith( - 'InvalidProof' - ) + await expect( + ownMevVault.updateState({ ...harvestParams, reward: 0 }) + ).to.be.revertedWithCustomError(ownMevVault, 'InvalidProof') }) it('fails for invalid proof', async () => { - await expect(ownMevVault.updateState({ ...harvestParams, proof: [] })).to.be.revertedWith( - 'InvalidProof' - ) + await expect( + ownMevVault.updateState({ ...harvestParams, proof: [] }) + ).to.be.revertedWithCustomError(ownMevVault, 'InvalidProof') }) it('fails for invalid root', async () => { const invalidRoot = '0x' + '1'.repeat(64) await expect( ownMevVault.updateState({ ...harvestParams, rewardsRoot: invalidRoot }) - ).to.be.revertedWith('InvalidRewardsRoot') + ).to.be.revertedWithCustomError(keeper, 'InvalidRewardsRoot') }) it('ignores unlocked mev reward', async () => { - const sharedMevEscrowBalance = parseEther('1') - await setBalance(await sharedMevEscrow.address, sharedMevEscrowBalance) + const sharedMevEscrowBalance = ethers.parseEther('1') + await setBalance(await sharedMevEscrow.getAddress(), sharedMevEscrowBalance) await increaseTime(REWARDS_DELAY) // update rewards root const vaultReward = { - reward: parseEther('10'), - vault: ownMevVault.address, + reward: ethers.parseEther('10'), + vault: await ownMevVault.getAddress(), unlockedMevReward: sharedMevEscrowBalance, } - const rewardsUpdate = getKeeperRewardsUpdateData([vaultReward], keeper, { + const rewardsUpdate = await getKeeperRewardsUpdateData([vaultReward], keeper, { nonce: 2, - updateTimestamp: '1680255895', + updateTimestamp: 1680255895, }) await keeper.connect(oracle).updateRewards({ rewardsRoot: rewardsUpdate.root, @@ -428,8 +427,13 @@ describe('KeeperRewards', () => { const receipt = await ownMevVault.updateState(harvestParams) await expect(receipt) .to.emit(keeper, 'Harvested') - .withArgs(ownMevVault.address, harvestParams.rewardsRoot, harvestParams.reward, 0) - expect(await waffle.provider.getBalance(sharedMevEscrow.address)).to.equal( + .withArgs( + await ownMevVault.getAddress(), + harvestParams.rewardsRoot, + harvestParams.reward, + 0 + ) + expect(await ethers.provider.getBalance(await sharedMevEscrow.getAddress())).to.equal( sharedMevEscrowBalance ) }) @@ -439,35 +443,35 @@ describe('KeeperRewards', () => { await expect(receipt) .to.emit(keeper, 'Harvested') .withArgs( - ownMevVault.address, + await ownMevVault.getAddress(), harvestParams.rewardsRoot, harvestParams.reward, harvestParams.unlockedMevReward ) - const rewards = await keeper.rewards(ownMevVault.address) + const rewards = await keeper.rewards(await ownMevVault.getAddress()) expect(rewards.nonce).to.equal(2) expect(rewards.assets).to.equal(harvestParams.reward) - const unlockedMevRewards = await keeper.unlockedMevRewards(ownMevVault.address) + const unlockedMevRewards = await keeper.unlockedMevRewards(await ownMevVault.getAddress()) expect(unlockedMevRewards.nonce).to.equal(0) expect(unlockedMevRewards.assets).to.equal(0) - expect(await keeper.isCollateralized(ownMevVault.address)).to.equal(true) - expect(await keeper.canHarvest(ownMevVault.address)).to.equal(false) - expect(await keeper.isHarvestRequired(ownMevVault.address)).to.equal(false) + expect(await keeper.isCollateralized(await ownMevVault.getAddress())).to.equal(true) + expect(await keeper.canHarvest(await ownMevVault.getAddress())).to.equal(false) + expect(await keeper.isHarvestRequired(await ownMevVault.getAddress())).to.equal(false) await snapshotGasCost(receipt) // does not fail for harvesting twice const mevEscrow = await ownMevVault.mevEscrow() await other.sendTransaction({ to: mevEscrow, - value: parseEther('5'), + value: ethers.parseEther('5'), }) const totalAssets = await ownMevVault.totalAssets() - const ownMevEscrowAssets = await waffle.provider.getBalance(mevEscrow) + const ownMevEscrowAssets = await ethers.provider.getBalance(mevEscrow) await expect(await ownMevVault.updateState(harvestParams)).to.not.emit(keeper, 'Harvested') - expect(await waffle.provider.getBalance(mevEscrow)).to.equal(ownMevEscrowAssets) + expect(await ethers.provider.getBalance(mevEscrow)).to.equal(ownMevEscrowAssets) expect(await ownMevVault.totalAssets()).to.equal(totalAssets) }) @@ -477,13 +481,13 @@ describe('KeeperRewards', () => { // update rewards root const vaultReward = { - reward: parseEther('10'), - vault: ownMevVault.address, - unlockedMevReward: 0, + reward: ethers.parseEther('10'), + vault: await ownMevVault.getAddress(), + unlockedMevReward: 0n, } - const rewardsUpdate = getKeeperRewardsUpdateData([vaultReward], keeper, { + const rewardsUpdate = await getKeeperRewardsUpdateData([vaultReward], keeper, { nonce: 2, - updateTimestamp: '1680255895', + updateTimestamp: 1680255895, }) await keeper.connect(oracle).updateRewards({ rewardsRoot: rewardsUpdate.root, @@ -495,56 +499,61 @@ describe('KeeperRewards', () => { const currHarvestParams = { rewardsRoot: rewardsUpdate.root, reward: vaultReward.reward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(rewardsUpdate.tree, vaultReward), } let receipt = await ownMevVault.updateState(prevHarvestParams) await expect(receipt) .to.emit(keeper, 'Harvested') - .withArgs(ownMevVault.address, prevHarvestParams.rewardsRoot, prevHarvestParams.reward, 0) + .withArgs( + await ownMevVault.getAddress(), + prevHarvestParams.rewardsRoot, + prevHarvestParams.reward, + 0 + ) - let rewards = await keeper.rewards(ownMevVault.address) + let rewards = await keeper.rewards(await ownMevVault.getAddress()) expect(rewards.nonce).to.equal(2) expect(rewards.assets).to.equal(prevHarvestParams.reward) - expect(await keeper.isCollateralized(ownMevVault.address)).to.equal(true) - expect(await keeper.canHarvest(ownMevVault.address)).to.equal(true) - expect(await keeper.isHarvestRequired(ownMevVault.address)).to.equal(false) + expect(await keeper.isCollateralized(await ownMevVault.getAddress())).to.equal(true) + expect(await keeper.canHarvest(await ownMevVault.getAddress())).to.equal(true) + expect(await keeper.isHarvestRequired(await ownMevVault.getAddress())).to.equal(false) await snapshotGasCost(receipt) receipt = await ownMevVault.updateState(currHarvestParams) await expect(receipt) .to.emit(keeper, 'Harvested') .withArgs( - ownMevVault.address, + await ownMevVault.getAddress(), currHarvestParams.rewardsRoot, - currHarvestParams.reward.sub(prevHarvestParams.reward), + currHarvestParams.reward - BigInt(prevHarvestParams.reward), 0 ) - rewards = await keeper.rewards(ownMevVault.address) + rewards = await keeper.rewards(await ownMevVault.getAddress()) expect(rewards.nonce).to.equal(3) expect(rewards.assets).to.equal(currHarvestParams.reward) - expect(await keeper.isCollateralized(ownMevVault.address)).to.equal(true) - expect(await keeper.canHarvest(ownMevVault.address)).to.equal(false) - expect(await keeper.isHarvestRequired(ownMevVault.address)).to.equal(false) + expect(await keeper.isCollateralized(await ownMevVault.getAddress())).to.equal(true) + expect(await keeper.canHarvest(await ownMevVault.getAddress())).to.equal(false) + expect(await keeper.isHarvestRequired(await ownMevVault.getAddress())).to.equal(false) await snapshotGasCost(receipt) // does not fail for harvesting twice const mevEscrow = await ownMevVault.mevEscrow() await other.sendTransaction({ to: mevEscrow, - value: parseEther('5'), + value: ethers.parseEther('5'), }) const totalAssets = await ownMevVault.totalAssets() - const ownMevEscrowAssets = await waffle.provider.getBalance(mevEscrow) + const ownMevEscrowAssets = await ethers.provider.getBalance(mevEscrow) await expect(await ownMevVault.updateState(prevHarvestParams)).to.not.emit( keeper, 'Harvested' ) - expect(await waffle.provider.getBalance(mevEscrow)).to.equal(ownMevEscrowAssets) + expect(await ethers.provider.getBalance(mevEscrow)).to.equal(ownMevEscrowAssets) expect(await ownMevVault.totalAssets()).to.equal(totalAssets) }) }) @@ -564,9 +573,9 @@ describe('KeeperRewards', () => { false ) const vaultReward = { - reward: parseEther('5'), - unlockedMevReward: parseEther('2'), - vault: sharedMevVault.address, + reward: ethers.parseEther('5'), + unlockedMevReward: ethers.parseEther('2'), + vault: await sharedMevVault.getAddress(), } const vaultRewards = [vaultReward] for (let i = 1; i < 11; i++) { @@ -579,15 +588,15 @@ describe('KeeperRewards', () => { }, true ) - const amount = parseEther(i.toString()) + const amount = ethers.parseEther(i.toString()) vaultRewards.push({ reward: amount, unlockedMevReward: amount, - vault: vlt.address, + vault: await vlt.getAddress(), }) } - const rewardsUpdate = getKeeperRewardsUpdateData(vaultRewards, keeper) + const rewardsUpdate = await getKeeperRewardsUpdateData(vaultRewards, keeper) await keeper.connect(oracle).updateRewards({ rewardsRoot: rewardsUpdate.root, updateTimestamp: rewardsUpdate.updateTimestamp, @@ -601,30 +610,33 @@ describe('KeeperRewards', () => { unlockedMevReward: vaultReward.unlockedMevReward, proof: getRewardsRootProof(rewardsUpdate.tree, vaultReward), } - await setBalance(sharedMevEscrow.address, BigNumber.from(harvestParams.unlockedMevReward)) + await setBalance(await sharedMevEscrow.getAddress(), BigInt(harvestParams.unlockedMevReward)) }) it('only vault can harvest', async () => { - await expect(keeper.harvest(harvestParams)).to.be.revertedWith('AccessDenied') + await expect(keeper.harvest(harvestParams)).to.be.revertedWithCustomError( + keeper, + 'AccessDenied' + ) }) it('fails for invalid unlocked MEV reward', async () => { await expect( - sharedMevVault.updateState({ ...harvestParams, unlockedMevReward: 0 }) - ).to.be.revertedWith('InvalidProof') + sharedMevVault.updateState({ ...harvestParams, unlockedMevReward: 0n }) + ).to.be.revertedWithCustomError(sharedMevVault, 'InvalidProof') }) it('fails for invalid proof', async () => { - await expect(sharedMevVault.updateState({ ...harvestParams, proof: [] })).to.be.revertedWith( - 'InvalidProof' - ) + await expect( + sharedMevVault.updateState({ ...harvestParams, proof: [] }) + ).to.be.revertedWithCustomError(sharedMevVault, 'InvalidProof') }) it('fails for invalid root', async () => { const invalidRoot = '0x' + '1'.repeat(64) await expect( sharedMevVault.updateState({ ...harvestParams, rewardsRoot: invalidRoot }) - ).to.be.revertedWith('InvalidRewardsRoot') + ).to.be.revertedWithCustomError(keeper, 'InvalidRewardsRoot') }) it('succeeds for latest rewards root', async () => { @@ -632,27 +644,27 @@ describe('KeeperRewards', () => { await expect(receipt) .to.emit(keeper, 'Harvested') .withArgs( - sharedMevVault.address, + await sharedMevVault.getAddress(), harvestParams.rewardsRoot, harvestParams.reward, harvestParams.unlockedMevReward ) - expect(await waffle.provider.getBalance(sharedMevEscrow.address)).to.equal(0) + expect(await ethers.provider.getBalance(await sharedMevEscrow.getAddress())).to.equal(0) await expect(receipt) .to.emit(sharedMevEscrow, 'Harvested') - .withArgs(sharedMevVault.address, harvestParams.unlockedMevReward) + .withArgs(await sharedMevVault.getAddress(), harvestParams.unlockedMevReward) - const rewards = await keeper.rewards(sharedMevVault.address) + const rewards = await keeper.rewards(await sharedMevVault.getAddress()) expect(rewards.nonce).to.equal(2) expect(rewards.assets).to.equal(harvestParams.reward) - const unlockedMevRewards = await keeper.unlockedMevRewards(sharedMevVault.address) + const unlockedMevRewards = await keeper.unlockedMevRewards(await sharedMevVault.getAddress()) expect(unlockedMevRewards.nonce).to.equal(2) expect(unlockedMevRewards.assets).to.equal(harvestParams.unlockedMevReward) - expect(await keeper.isCollateralized(sharedMevVault.address)).to.equal(true) - expect(await keeper.canHarvest(sharedMevVault.address)).to.equal(false) - expect(await keeper.isHarvestRequired(sharedMevVault.address)).to.equal(false) + expect(await keeper.isCollateralized(await sharedMevVault.getAddress())).to.equal(true) + expect(await keeper.canHarvest(await sharedMevVault.getAddress())).to.equal(false) + expect(await keeper.isHarvestRequired(await sharedMevVault.getAddress())).to.equal(false) await snapshotGasCost(receipt) // does not fail for harvesting twice @@ -665,14 +677,14 @@ describe('KeeperRewards', () => { // update rewards root const vaultReward = { - reward: parseEther('10'), - vault: sharedMevVault.address, - unlockedMevReward: parseEther('4'), + reward: ethers.parseEther('10'), + vault: await sharedMevVault.getAddress(), + unlockedMevReward: ethers.parseEther('4'), } - await setBalance(sharedMevEscrow.address, vaultReward.unlockedMevReward) - const rewardsUpdate = getKeeperRewardsUpdateData([vaultReward], keeper, { + await setBalance(await sharedMevEscrow.getAddress(), vaultReward.unlockedMevReward) + const rewardsUpdate = await getKeeperRewardsUpdateData([vaultReward], keeper, { nonce: 2, - updateTimestamp: '1680255895', + updateTimestamp: 1680255895, }) await keeper.connect(oracle).updateRewards({ rewardsRoot: rewardsUpdate.root, @@ -692,49 +704,50 @@ describe('KeeperRewards', () => { await expect(receipt) .to.emit(keeper, 'Harvested') .withArgs( - sharedMevVault.address, + await sharedMevVault.getAddress(), prevHarvestParams.rewardsRoot, prevHarvestParams.reward, prevHarvestParams.unlockedMevReward ) - expect(await waffle.provider.getBalance(sharedMevEscrow.address)).to.equal(parseEther('2')) + expect(await ethers.provider.getBalance(await sharedMevEscrow.getAddress())).to.equal( + ethers.parseEther('2') + ) await expect(receipt) .to.emit(sharedMevEscrow, 'Harvested') - .withArgs(sharedMevVault.address, prevHarvestParams.unlockedMevReward) + .withArgs(await sharedMevVault.getAddress(), prevHarvestParams.unlockedMevReward) - let rewards = await keeper.rewards(sharedMevVault.address) + let rewards = await keeper.rewards(await sharedMevVault.getAddress()) expect(rewards.nonce).to.equal(2) expect(rewards.assets).to.equal(prevHarvestParams.reward) - expect(await keeper.isCollateralized(sharedMevVault.address)).to.equal(true) - expect(await keeper.canHarvest(sharedMevVault.address)).to.equal(true) - expect(await keeper.isHarvestRequired(sharedMevVault.address)).to.equal(false) + expect(await keeper.isCollateralized(await sharedMevVault.getAddress())).to.equal(true) + expect(await keeper.canHarvest(await sharedMevVault.getAddress())).to.equal(true) + expect(await keeper.isHarvestRequired(await sharedMevVault.getAddress())).to.equal(false) await snapshotGasCost(receipt) receipt = await sharedMevVault.updateState(currHarvestParams) - const sharedMevDelta = currHarvestParams.unlockedMevReward.sub( - prevHarvestParams.unlockedMevReward - ) + const sharedMevDelta = + currHarvestParams.unlockedMevReward - BigInt(prevHarvestParams.unlockedMevReward) await expect(receipt) .to.emit(keeper, 'Harvested') .withArgs( - sharedMevVault.address, + await sharedMevVault.getAddress(), currHarvestParams.rewardsRoot, - currHarvestParams.reward.sub(prevHarvestParams.reward), + currHarvestParams.reward - BigInt(prevHarvestParams.reward), sharedMevDelta ) await expect(receipt) .to.emit(sharedMevEscrow, 'Harvested') - .withArgs(sharedMevVault.address, sharedMevDelta) - expect(await waffle.provider.getBalance(sharedMevEscrow.address)).to.equal(0) + .withArgs(await sharedMevVault.getAddress(), sharedMevDelta) + expect(await ethers.provider.getBalance(await sharedMevEscrow.getAddress())).to.equal(0) - rewards = await keeper.rewards(sharedMevVault.address) + rewards = await keeper.rewards(await sharedMevVault.getAddress()) expect(rewards.nonce).to.equal(3) expect(rewards.assets).to.equal(currHarvestParams.reward) - expect(await keeper.isCollateralized(sharedMevVault.address)).to.equal(true) - expect(await keeper.canHarvest(sharedMevVault.address)).to.equal(false) - expect(await keeper.isHarvestRequired(sharedMevVault.address)).to.equal(false) + expect(await keeper.isCollateralized(await sharedMevVault.getAddress())).to.equal(true) + expect(await keeper.canHarvest(await sharedMevVault.getAddress())).to.equal(false) + expect(await keeper.isHarvestRequired(await sharedMevVault.getAddress())).to.equal(false) await snapshotGasCost(receipt) // does not fail for harvesting twice @@ -750,17 +763,20 @@ describe('KeeperRewards', () => { }) it('fails with number larger than total oracles', async () => { - await expect(keeper.connect(owner).setRewardsMinOracles(ORACLES.length + 1)).revertedWith( - 'InvalidOracles' - ) + await expect( + keeper.connect(dao).setRewardsMinOracles(ORACLES.length + 1) + ).revertedWithCustomError(keeper, 'InvalidOracles') }) it('fails with zero', async () => { - await expect(keeper.connect(owner).setRewardsMinOracles(0)).revertedWith('InvalidOracles') + await expect(keeper.connect(dao).setRewardsMinOracles(0)).revertedWithCustomError( + keeper, + 'InvalidOracles' + ) }) it('succeeds', async () => { - const receipt = await keeper.connect(owner).setRewardsMinOracles(1) + const receipt = await keeper.connect(dao).setRewardsMinOracles(1) await expect(receipt).to.emit(keeper, 'RewardsMinOraclesUpdated').withArgs(1) expect(await keeper.rewardsMinOracles()).to.be.eq(1) await snapshotGasCost(receipt) diff --git a/test/KeeperValidators.spec.ts b/test/KeeperValidators.spec.ts index d224aaba..014aa1d8 100644 --- a/test/KeeperValidators.spec.ts +++ b/test/KeeperValidators.spec.ts @@ -1,6 +1,6 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Contract, Wallet } from 'ethers' -import { hexlify, parseEther } from 'ethers/lib/utils' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthVault, IKeeperValidators, Keeper } from '../typechain-types' import { ThenArg } from '../helpers/types' import { ethVaultFixture, getOraclesSignatures } from './shared/fixtures' @@ -24,31 +24,25 @@ import { } from './shared/validators' import snapshotGasCost from './shared/snapshotGasCost' import { collateralizeEthVault } from './shared/rewards' - -const createFixtureLoader = waffle.createFixtureLoader +import { toHexString } from './shared/utils' describe('KeeperValidators', () => { - const capacity = parseEther('1000') + const capacity = ethers.parseEther('1000') const feePercent = 1000 const metadataIpfsHash = 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u' const referrer = ZERO_ADDRESS const deadline = VALIDATORS_DEADLINE - const depositAmount = parseEther('32') + const depositAmount = ethers.parseEther('32') - let loadFixture: ReturnType let createVault: ThenArg>['createEthVault'] - let sender: Wallet, owner: Wallet, admin: Wallet + let sender: Wallet, dao: Wallet, admin: Wallet let keeper: Keeper, vault: EthVault, validatorsRegistry: Contract let validatorsData: EthValidatorsData let validatorsRegistryRoot: string - before('create fixture loader', async () => { - ;[sender, admin, owner] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) - }) - beforeEach(async () => { + ;[dao, sender, admin] = await (ethers as any).getSigners() ;({ keeper, validatorsRegistry, @@ -75,7 +69,7 @@ describe('KeeperValidators', () => { const exitSignatureIpfsHash = exitSignatureIpfsHashes[0] proof = getValidatorProof(validatorsData.tree, validator, 0) await vault.connect(sender).deposit(sender.address, referrer, { value: depositAmount }) - signingData = getEthValidatorsSigningData( + signingData = await getEthValidatorsSigningData( validator, deadline, exitSignatureIpfsHash, @@ -93,18 +87,22 @@ describe('KeeperValidators', () => { }) it('fails for invalid vault', async () => { - await expect(keeper.approveValidators(approveParams)).revertedWith('AccessDenied') + await expect(keeper.approveValidators(approveParams)).revertedWithCustomError( + keeper, + 'AccessDenied' + ) }) it('fails for invalid validators registry root', async () => { await validatorsRegistry.deposit( validator.subarray(0, 48), - getWithdrawalCredentials(vault.address), + getWithdrawalCredentials(await vault.getAddress()), validator.subarray(48, 144), validator.subarray(144, 176), { value: depositAmount } ) - await expect(vault.registerValidator(approveParams, proof)).revertedWith( + await expect(vault.registerValidator(approveParams, proof)).revertedWithCustomError( + keeper, 'InvalidValidatorsRegistryRoot' ) }) @@ -118,7 +116,7 @@ describe('KeeperValidators', () => { }, proof ) - ).revertedWith('NotEnoughSignatures') + ).revertedWithCustomError(keeper, 'NotEnoughSignatures') }) it('fails for invalid deadline', async () => { @@ -126,11 +124,11 @@ describe('KeeperValidators', () => { vault.registerValidator( { ...approveParams, - deadline: deadline + 1, + deadline: deadline + 1n, }, proof ) - ).revertedWith('InvalidOracle') + ).revertedWithCustomError(keeper, 'InvalidOracle') }) it('fails for expired deadline', async () => { @@ -138,11 +136,11 @@ describe('KeeperValidators', () => { vault.registerValidator( { ...approveParams, - deadline: Math.floor(Date.now() / 1000), + deadline: Math.floor(Date.now() / 1000) - 1, }, proof ) - ).revertedWith('DeadlineExpired') + ).revertedWithCustomError(keeper, 'DeadlineExpired') }) it('fails for invalid validator', async () => { @@ -154,7 +152,7 @@ describe('KeeperValidators', () => { }, proof ) - ).revertedWith('InvalidOracle') + ).revertedWithCustomError(keeper, 'InvalidOracle') }) it('fails for invalid proof', async () => { @@ -163,21 +161,21 @@ describe('KeeperValidators', () => { approveParams, getValidatorProof(validatorsData.tree, validatorsData.validators[1], 1) ) - ).revertedWith('InvalidProof') + ).revertedWithCustomError(keeper, 'InvalidProof') }) it('succeeds', async () => { - let rewards = await keeper.rewards(vault.address) + let rewards = await keeper.rewards(await vault.getAddress()) expect(rewards.nonce).to.eq(0) expect(rewards.assets).to.eq(0) let receipt = await vault.registerValidator(approveParams, proof) await expect(receipt) .to.emit(keeper, 'ValidatorsApproval') - .withArgs(vault.address, approveParams.exitSignaturesIpfsHash) + .withArgs(await vault.getAddress(), approveParams.exitSignaturesIpfsHash) // collateralize vault - rewards = await keeper.rewards(vault.address) + rewards = await keeper.rewards(await vault.getAddress()) expect(rewards.nonce).to.eq(1) expect(rewards.assets).to.eq(0) @@ -186,7 +184,8 @@ describe('KeeperValidators', () => { const newValidatorsRegistryRoot = await validatorsRegistry.get_deposit_root() // fails to register twice - await expect(vault.registerValidator(approveParams, proof)).revertedWith( + await expect(vault.registerValidator(approveParams, proof)).revertedWithCustomError( + keeper, 'InvalidValidatorsRegistryRoot' ) @@ -195,7 +194,7 @@ describe('KeeperValidators', () => { const newProof = getValidatorProof(validatorsData.tree, newValidator, 1) await vault.connect(sender).deposit(sender.address, referrer, { value: depositAmount }) - const newSigningData = getEthValidatorsSigningData( + const newSigningData = await getEthValidatorsSigningData( newValidator, deadline, newExitSignatureIpfsHash, @@ -216,7 +215,7 @@ describe('KeeperValidators', () => { ) // doesn't collateralize twice - rewards = await keeper.rewards(vault.address) + rewards = await keeper.rewards(await vault.getAddress()) expect(rewards.nonce).to.eq(1) expect(rewards.assets).to.eq(0) @@ -240,10 +239,10 @@ describe('KeeperValidators', () => { indexes = validators.map((v) => sortedVals.indexOf(v)) await vault .connect(sender) - .deposit(sender.address, referrer, { value: depositAmount.mul(validators.length) }) + .deposit(sender.address, referrer, { value: depositAmount * BigInt(validators.length) }) const exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] - signingData = getEthValidatorsSigningData( + signingData = await getEthValidatorsSigningData( Buffer.concat(validators), deadline, exitSignaturesIpfsHash, @@ -253,7 +252,7 @@ describe('KeeperValidators', () => { ) approveParams = { validatorsRegistryRoot, - validators: hexlify(Buffer.concat(validators)), + validators: toHexString(Buffer.concat(validators)), signatures: getOraclesSignatures(signingData, ORACLES.length), exitSignaturesIpfsHash, deadline, @@ -261,21 +260,24 @@ describe('KeeperValidators', () => { }) it('fails for invalid vault', async () => { - await expect(keeper.approveValidators(approveParams)).revertedWith('AccessDenied') + await expect(keeper.approveValidators(approveParams)).revertedWithCustomError( + keeper, + 'AccessDenied' + ) }) it('fails for invalid validators registry root', async () => { const validator = validators[0] await validatorsRegistry.deposit( validator.subarray(0, 48), - getWithdrawalCredentials(vault.address), + getWithdrawalCredentials(await vault.getAddress()), validator.subarray(48, 144), validator.subarray(144, 176), { value: depositAmount } ) await expect( vault.registerValidators(approveParams, indexes, proof.proofFlags, proof.proof) - ).revertedWith('InvalidValidatorsRegistryRoot') + ).revertedWithCustomError(keeper, 'InvalidValidatorsRegistryRoot') }) it('fails for invalid signatures', async () => { @@ -289,7 +291,7 @@ describe('KeeperValidators', () => { proof.proofFlags, proof.proof ) - ).revertedWith('NotEnoughSignatures') + ).revertedWithCustomError(keeper, 'NotEnoughSignatures') }) it('fails for invalid validators', async () => { @@ -303,7 +305,7 @@ describe('KeeperValidators', () => { proof.proofFlags, proof.proof ) - ).revertedWith('InvalidOracle') + ).revertedWithCustomError(keeper, 'InvalidOracle') }) it('fails for invalid deadline', async () => { @@ -311,13 +313,13 @@ describe('KeeperValidators', () => { vault.registerValidators( { ...approveParams, - deadline: deadline + 1, + deadline: deadline + 1n, }, indexes, proof.proofFlags, proof.proof ) - ).revertedWith('InvalidOracle') + ).revertedWithCustomError(keeper, 'InvalidOracle') }) it('fails for expired deadline', async () => { @@ -325,13 +327,13 @@ describe('KeeperValidators', () => { vault.registerValidators( { ...approveParams, - deadline: Math.floor(Date.now() / 1000), + deadline: Math.floor(Date.now() / 1000) - 1, }, indexes, proof.proofFlags, proof.proof ) - ).revertedWith('DeadlineExpired') + ).revertedWithCustomError(keeper, 'DeadlineExpired') }) it('fails for invalid proof', async () => { @@ -345,7 +347,7 @@ describe('KeeperValidators', () => { validators: validators[1], exitSignaturesIpfsHash, signatures: getOraclesSignatures( - getEthValidatorsSigningData( + await getEthValidatorsSigningData( validators[1], deadline, exitSignaturesIpfsHash, @@ -360,11 +362,11 @@ describe('KeeperValidators', () => { invalidProof.proofFlags, invalidProof.proof ) - ).revertedWith('InvalidProof') + ).revertedWithCustomError(keeper, 'InvalidProof') }) it('succeeds', async () => { - let rewards = await keeper.rewards(vault.address) + let rewards = await keeper.rewards(await vault.getAddress()) expect(rewards.nonce).to.eq(0) expect(rewards.assets).to.eq(0) const validatorsConcat = Buffer.concat(validators) @@ -377,9 +379,9 @@ describe('KeeperValidators', () => { ) await expect(receipt) .to.emit(keeper, 'ValidatorsApproval') - .withArgs(vault.address, approveParams.exitSignaturesIpfsHash) + .withArgs(await vault.getAddress(), approveParams.exitSignaturesIpfsHash) - rewards = await keeper.rewards(vault.address) + rewards = await keeper.rewards(await vault.getAddress()) expect(rewards.nonce).to.eq(1) expect(rewards.assets).to.eq(0) @@ -390,15 +392,15 @@ describe('KeeperValidators', () => { // fails to register twice await expect( vault.registerValidators(approveParams, indexes, proof.proofFlags, proof.proof) - ).revertedWith('InvalidValidatorsRegistryRoot') + ).revertedWithCustomError(keeper, 'InvalidValidatorsRegistryRoot') await vault .connect(sender) - .deposit(sender.address, referrer, { value: depositAmount.mul(validators.length) }) + .deposit(sender.address, referrer, { value: depositAmount * BigInt(validators.length) }) // reset validator index await vault.connect(admin).setValidatorsRoot(validatorsData.root) - const newSigningData = getEthValidatorsSigningData( + const newSigningData = await getEthValidatorsSigningData( validatorsConcat, deadline, approveParams.exitSignaturesIpfsHash as string, @@ -421,7 +423,7 @@ describe('KeeperValidators', () => { ) // doesn't collateralize twice - rewards = await keeper.rewards(vault.address) + rewards = await keeper.rewards(await vault.getAddress()) expect(rewards.nonce).to.eq(1) expect(rewards.assets).to.eq(0) @@ -438,7 +440,7 @@ describe('KeeperValidators', () => { beforeEach(async () => { exitSignaturesIpfsHash = exitSignatureIpfsHashes[0] deadline = Math.floor(Date.now() / 1000) + 10000000 - signingData = getEthValidatorsExitSignaturesSigningData( + signingData = await getEthValidatorsExitSignaturesSigningData( keeper, vault, deadline, @@ -451,53 +453,53 @@ describe('KeeperValidators', () => { it('fails for invalid vault', async () => { await expect( keeper.updateExitSignatures( - keeper.address, + await keeper.getAddress(), deadline, exitSignaturesIpfsHash, oraclesSignatures ) - ).revertedWith('InvalidVault') + ).revertedWithCustomError(keeper, 'InvalidVault') }) it('fails for not collateralized vault', async () => { await expect( keeper.updateExitSignatures( - vault.address, + await vault.getAddress(), deadline, exitSignaturesIpfsHash, oraclesSignatures ) - ).revertedWith('InvalidVault') + ).revertedWithCustomError(keeper, 'InvalidVault') }) it('fails for invalid signatures', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) await expect( keeper.updateExitSignatures( - vault.address, + await vault.getAddress(), deadline, exitSignaturesIpfsHash, getOraclesSignatures(signingData, VALIDATORS_MIN_ORACLES - 1) ) - ).revertedWith('NotEnoughSignatures') + ).revertedWithCustomError(keeper, 'NotEnoughSignatures') }) it('fails for invalid deadline', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) await expect( keeper.updateExitSignatures( - vault.address, + await vault.getAddress(), deadline + 1, exitSignaturesIpfsHash, oraclesSignatures ) - ).revertedWith('InvalidOracle') + ).revertedWithCustomError(keeper, 'InvalidOracle') }) it('fails for expired deadline', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) const newDeadline = Math.floor(Date.now() / 1000) - const newSigningData = getEthValidatorsExitSignaturesSigningData( + const newSigningData = await getEthValidatorsExitSignaturesSigningData( keeper, vault, newDeadline, @@ -506,18 +508,18 @@ describe('KeeperValidators', () => { ) await expect( keeper.updateExitSignatures( - vault.address, + await vault.getAddress(), newDeadline, exitSignaturesIpfsHash, getOraclesSignatures(newSigningData, ORACLES.length) ) - ).revertedWith('DeadlineExpired') + ).revertedWithCustomError(keeper, 'DeadlineExpired') }) it('fails to submit update twice', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) await keeper.updateExitSignatures( - vault.address, + await vault.getAddress(), deadline, exitSignaturesIpfsHash, oraclesSignatures @@ -525,31 +527,36 @@ describe('KeeperValidators', () => { await expect( keeper.updateExitSignatures( - vault.address, + await vault.getAddress(), deadline, exitSignaturesIpfsHash, oraclesSignatures ) - ).revertedWith('InvalidOracle') + ).revertedWithCustomError(keeper, 'InvalidOracle') }) it('succeeds', async () => { - const nonce = await keeper.exitSignaturesNonces(vault.address) + const nonce = await keeper.exitSignaturesNonces(await vault.getAddress()) expect(nonce).to.eq(0) await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) const receipt = await keeper .connect(sender) - .updateExitSignatures(vault.address, deadline, exitSignaturesIpfsHash, oraclesSignatures) + .updateExitSignatures( + await vault.getAddress(), + deadline, + exitSignaturesIpfsHash, + oraclesSignatures + ) await expect(receipt) .to.emit(keeper, 'ExitSignaturesUpdated') - .withArgs(sender.address, vault.address, nonce, exitSignaturesIpfsHash) - expect(await keeper.exitSignaturesNonces(vault.address)).to.eq(nonce.add(1)) + .withArgs(sender.address, await vault.getAddress(), nonce, exitSignaturesIpfsHash) + expect(await keeper.exitSignaturesNonces(await vault.getAddress())).to.eq(nonce + 1n) }) }) - describe('set validators rewards oracles', () => { + describe('set validators oracles', () => { it('fails if not owner', async () => { await expect(keeper.connect(sender).setValidatorsMinOracles(1)).revertedWith( 'Ownable: caller is not the owner' @@ -557,17 +564,20 @@ describe('KeeperValidators', () => { }) it('fails with number larger than total oracles', async () => { - await expect(keeper.connect(owner).setValidatorsMinOracles(ORACLES.length + 1)).revertedWith( - 'InvalidOracles' - ) + await expect( + keeper.connect(dao).setValidatorsMinOracles(ORACLES.length + 1) + ).revertedWithCustomError(keeper, 'InvalidOracles') }) it('fails with zero', async () => { - await expect(keeper.connect(owner).setValidatorsMinOracles(0)).revertedWith('InvalidOracles') + await expect(keeper.connect(dao).setValidatorsMinOracles(0)).revertedWithCustomError( + keeper, + 'InvalidOracles' + ) }) it('succeeds', async () => { - const receipt = await keeper.connect(owner).setValidatorsMinOracles(1) + const receipt = await keeper.connect(dao).setValidatorsMinOracles(1) await expect(receipt).to.emit(keeper, 'ValidatorsMinOraclesUpdated').withArgs(1) expect(await keeper.validatorsMinOracles()).to.be.eq(1) await snapshotGasCost(receipt) diff --git a/test/OsToken.spec.ts b/test/OsToken.spec.ts index f6e19e7b..6e3bd300 100644 --- a/test/OsToken.spec.ts +++ b/test/OsToken.spec.ts @@ -1,6 +1,6 @@ -import { ethers, network, waffle } from 'hardhat' +import { ethers, network } from 'hardhat' import { Wallet } from 'ethers' -import { arrayify, parseEther } from 'ethers/lib/utils' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { OsToken } from '../typechain-types' import snapshotGasCost from './shared/snapshotGasCost' import { ethVaultFixture } from './shared/fixtures' @@ -21,28 +21,24 @@ import { domainSeparator, getSignatureFromTypedData, increaseTime, - latestTimestamp, + getLatestBlockTimestamp, } from './shared/utils' -const createFixtureLoader = waffle.createFixtureLoader - describe('OsToken', () => { - const assets = parseEther('2') + const assets = ethers.parseEther('2') const initialSupply = 1000 - let initialHolder: Wallet, spender: Wallet, admin: Wallet, owner: Wallet, recipient: Wallet + let initialHolder: Wallet, spender: Wallet, admin: Wallet, dao: Wallet, recipient: Wallet let vaultImpl: string let osToken: OsToken - let loadFixture: ReturnType before('create fixture loader', async () => { - ;[initialHolder, owner, admin, spender, recipient] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) + ;[dao, initialHolder, admin, spender, recipient] = await (ethers as any).getSigners() }) beforeEach('deploy fixture', async () => { const fixture = await loadFixture(ethVaultFixture) const vaultParams = { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', } @@ -68,7 +64,7 @@ describe('OsToken', () => { }) it('owner can change', async () => { - const receipt = await osToken.connect(owner).setCapacity(0) + const receipt = await osToken.connect(dao).setCapacity(0) await expect(receipt).to.emit(osToken, 'CapacityUpdated').withArgs(0) expect(await osToken.capacity()).to.eq(0) await snapshotGasCost(receipt) @@ -77,21 +73,22 @@ describe('OsToken', () => { describe('treasury', () => { it('not owner cannot change', async () => { - await expect(osToken.connect(initialHolder).setTreasury(owner.address)).to.be.revertedWith( + await expect(osToken.connect(initialHolder).setTreasury(dao.address)).to.be.revertedWith( 'Ownable: caller is not the owner' ) }) it('cannot set to zero address', async () => { - await expect(osToken.connect(owner).setTreasury(ZERO_ADDRESS)).to.be.revertedWith( + await expect(osToken.connect(dao).setTreasury(ZERO_ADDRESS)).to.be.revertedWithCustomError( + osToken, 'ZeroAddress' ) }) it('owner can change', async () => { - const receipt = await osToken.connect(owner).setTreasury(owner.address) - await expect(receipt).to.emit(osToken, 'TreasuryUpdated').withArgs(owner.address) - expect(await osToken.treasury()).to.eq(owner.address) + const receipt = await osToken.connect(dao).setTreasury(dao.address) + await expect(receipt).to.emit(osToken, 'TreasuryUpdated').withArgs(dao.address) + expect(await osToken.treasury()).to.eq(dao.address) await snapshotGasCost(receipt) }) }) @@ -104,14 +101,15 @@ describe('OsToken', () => { }) it('cannot set to more than 100%', async () => { - await expect(osToken.connect(owner).setFeePercent(10001)).to.be.revertedWith( + await expect(osToken.connect(dao).setFeePercent(10001)).to.be.revertedWithCustomError( + osToken, 'InvalidFeePercent' ) }) it('owner can change', async () => { await increaseTime(ONE_DAY * 1000) - const receipt = await osToken.connect(owner).setFeePercent(100) + const receipt = await osToken.connect(dao).setFeePercent(100) await expect(receipt).to.emit(osToken, 'FeePercentUpdated').withArgs(100) await expect(receipt).to.emit(osToken, 'StateUpdated') expect(await osToken.feePercent()).to.eq(100) @@ -127,13 +125,14 @@ describe('OsToken', () => { }) it('cannot set to zero address', async () => { - await expect(osToken.connect(owner).setChecker(ZERO_ADDRESS)).to.be.revertedWith( + await expect(osToken.connect(dao).setChecker(ZERO_ADDRESS)).to.be.revertedWithCustomError( + osToken, 'ZeroAddress' ) }) it('owner can change', async () => { - const receipt = await osToken.connect(owner).setChecker(vaultImpl) + const receipt = await osToken.connect(dao).setChecker(vaultImpl) await expect(receipt).to.emit(osToken, 'CheckerUpdated').withArgs(vaultImpl) expect(await osToken.checker()).to.eq(vaultImpl) await snapshotGasCost(receipt) @@ -142,26 +141,30 @@ describe('OsToken', () => { describe('keeper', () => { it('not owner cannot change', async () => { - await expect(osToken.connect(initialHolder).setKeeper(owner.address)).to.be.revertedWith( + await expect(osToken.connect(initialHolder).setKeeper(dao.address)).to.be.revertedWith( 'Ownable: caller is not the owner' ) }) it('cannot set to zero address', async () => { - await expect(osToken.connect(owner).setKeeper(ZERO_ADDRESS)).to.be.revertedWith('ZeroAddress') + await expect(osToken.connect(dao).setKeeper(ZERO_ADDRESS)).to.be.revertedWithCustomError( + osToken, + 'ZeroAddress' + ) }) it('owner can change', async () => { - const receipt = await osToken.connect(owner).setKeeper(owner.address) - await expect(receipt).to.emit(osToken, 'KeeperUpdated').withArgs(owner.address) - expect(await osToken.keeper()).to.eq(owner.address) + const receipt = await osToken.connect(dao).setKeeper(dao.address) + await expect(receipt).to.emit(osToken, 'KeeperUpdated').withArgs(dao.address) + expect(await osToken.keeper()).to.eq(dao.address) await snapshotGasCost(receipt) }) }) describe('avg reward per second', () => { it('not owner cannot change', async () => { - await expect(osToken.connect(owner).setAvgRewardPerSecond(0)).to.be.revertedWith( + await expect(osToken.connect(dao).setAvgRewardPerSecond(0)).to.be.revertedWithCustomError( + osToken, 'AccessDenied' ) }) @@ -206,13 +209,13 @@ describe('OsToken', () => { const amount = balance + 1 await expect( osToken.connect(initialHolder).transfer(recipient.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('reverts with zero address recipient', async () => { await expect( osToken.connect(initialHolder).transfer(ZERO_ADDRESS, balance) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(osToken, 'ZeroAddress') }) describe('when the sender transfers all balance', () => { @@ -295,7 +298,7 @@ describe('OsToken', () => { it('reverts', async () => { await expect( osToken.connect(spender).transferFrom(initialHolder.address, spender.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) }) @@ -313,7 +316,7 @@ describe('OsToken', () => { it('reverts', async () => { await expect( osToken.connect(spender).transferFrom(initialHolder.address, spender.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) @@ -327,7 +330,7 @@ describe('OsToken', () => { it('reverts', async () => { await expect( osToken.connect(spender).transferFrom(initialHolder.address, spender.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) }) @@ -349,10 +352,10 @@ describe('OsToken', () => { describe('approve', () => { it('fails to approve zero address', async () => { - const amount = parseEther('1') - await expect(osToken.connect(initialHolder).approve(ZERO_ADDRESS, amount)).to.be.revertedWith( - 'ZeroAddress' - ) + const amount = ethers.parseEther('1') + await expect( + osToken.connect(initialHolder).approve(ZERO_ADDRESS, amount) + ).to.be.revertedWithCustomError(osToken, 'ZeroAddress') }) describe('when the sender has enough balance', () => { @@ -487,7 +490,7 @@ describe('OsToken', () => { it('reverts', async () => { await expect( osToken.connect(initialHolder).increaseAllowance(ZERO_ADDRESS, amount) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(osToken, 'ZeroAddress') }) }) }) @@ -499,7 +502,7 @@ describe('OsToken', () => { it('reverts', async () => { await expect( osToken.connect(initialHolder).decreaseAllowance(spender.address, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) @@ -540,7 +543,7 @@ describe('OsToken', () => { osToken .connect(initialHolder) .decreaseAllowance(spender.address, approvedAmount + 1) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) } @@ -563,7 +566,7 @@ describe('OsToken', () => { it('reverts', async () => { await expect( osToken.connect(initialHolder).decreaseAllowance(spender, amount) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) }) }) @@ -576,19 +579,21 @@ describe('OsToken', () => { const chainId = network.config.chainId const owner = new EthereumWallet( - Buffer.from(arrayify('0x35a1c4d02b06d93778758410e5c09e010760268cf98b1af33c2d0646f27a8b70')) + Buffer.from( + ethers.getBytes('0x35a1c4d02b06d93778758410e5c09e010760268cf98b1af33c2d0646f27a8b70') + ) ) const ownerAddress = owner.getChecksumAddressString() const ownerPrivateKey = owner.getPrivateKey() - const buildData = (deadline = maxDeadline, spender) => ({ + const buildData = async (deadline = maxDeadline, spender) => ({ primaryType: 'Permit', types: { EIP712Domain, Permit: PermitSig }, domain: { name: OSTOKEN_NAME, version: '1', chainId, - verifyingContract: osToken.address, + verifyingContract: await osToken.getAddress(), }, message: { owner: ownerAddress, spender, value, nonce, deadline }, }) @@ -599,14 +604,14 @@ describe('OsToken', () => { it('domain separator', async () => { expect(await osToken.DOMAIN_SEPARATOR()).to.equal( - await domainSeparator(OSTOKEN_NAME, '1', chainId, osToken.address) + await domainSeparator(OSTOKEN_NAME, '1', chainId, await osToken.getAddress()) ) }) it('accepts owner signature', async () => { const { v, r, s } = getSignatureFromTypedData( ownerPrivateKey, - buildData(maxDeadline, spender.address) + await buildData(maxDeadline, spender.address) ) const receipt = await osToken.permit( @@ -631,48 +636,48 @@ describe('OsToken', () => { it('rejects reused signature', async () => { const { v, r, s } = getSignatureFromTypedData( ownerPrivateKey, - buildData(maxDeadline, spender.address) + await buildData(maxDeadline, spender.address) ) await osToken.permit(ownerAddress, spender.address, value, maxDeadline, v, r, s) await expect( osToken.permit(initialHolder.address, spender.address, value, maxDeadline, v, r, s) - ).to.be.revertedWith('PermitInvalidSigner') + ).to.be.revertedWithCustomError(osToken, 'PermitInvalidSigner') }) it('rejects other signature', async () => { const otherWallet = EthereumWallet.generate() - const data = buildData(maxDeadline, spender.address) + const data = await buildData(maxDeadline, spender.address) const { v, r, s } = getSignatureFromTypedData(otherWallet.getPrivateKey(), data) await expect( osToken.permit(ownerAddress, spender.address, value, maxDeadline, v, r, s) - ).to.be.revertedWith('PermitInvalidSigner') + ).to.be.revertedWithCustomError(osToken, 'PermitInvalidSigner') }) it('rejects expired permit', async () => { - const deadline = (await latestTimestamp()).sub(500).toString() + const deadline = ((await getLatestBlockTimestamp()) - 500).toString() const { v, r, s } = getSignatureFromTypedData( ownerPrivateKey, - buildData(deadline, spender.address) + await buildData(deadline, spender.address) ) await expect( osToken.permit(ownerAddress, spender.address, value, deadline, v, r, s) - ).to.be.revertedWith('DeadlineExpired') + ).to.be.revertedWithCustomError(osToken, 'DeadlineExpired') }) it('rejects zero address', async () => { - const deadline = (await latestTimestamp()).sub(500).toString() + const deadline = ((await getLatestBlockTimestamp()) - 500).toString() const { v, r, s } = getSignatureFromTypedData( ownerPrivateKey, - buildData(deadline, ZERO_ADDRESS) + await buildData(deadline, ZERO_ADDRESS) ) await expect( osToken.permit(ownerAddress, ZERO_ADDRESS, value, deadline, v, r, s) - ).to.be.revertedWith('ZeroAddress') + ).to.be.revertedWithCustomError(osToken, 'ZeroAddress') }) }) }) diff --git a/test/OsTokenConfig.spec.ts b/test/OsTokenConfig.spec.ts index d0c19092..b531795f 100644 --- a/test/OsTokenConfig.spec.ts +++ b/test/OsTokenConfig.spec.ts @@ -1,5 +1,6 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { OsTokenConfig } from '../typechain-types' import { ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' @@ -13,8 +14,6 @@ import { } from './shared/constants' import snapshotGasCost from './shared/snapshotGasCost' -const createFixtureLoader = waffle.createFixtureLoader - describe('OsTokenConfig', () => { const newConfig = { redeemFromLtvPercent: OSTOKEN_REDEEM_FROM_LTV + 1, @@ -23,16 +22,11 @@ describe('OsTokenConfig', () => { liqBonusPercent: OSTOKEN_LIQ_BONUS + 1, ltvPercent: OSTOKEN_LTV + 1, } - let owner: Wallet, other: Wallet + let dao: Wallet, other: Wallet let osTokenConfig: OsTokenConfig - let loadFixture: ReturnType - - before('create fixture loader', async () => { - ;[owner, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) - }) beforeEach('deploy fixtures', async () => { + ;[dao, other] = await (ethers as any).getSigners() ;({ osTokenConfig } = await loadFixture(ethVaultFixture)) }) @@ -53,14 +47,14 @@ describe('OsTokenConfig', () => { it('fails with invalid redeem params', async () => { await expect( osTokenConfig - .connect(owner) + .connect(dao) .updateConfig({ ...newConfig, redeemToLtvPercent: 9000, redeemFromLtvPercent: 8900 }) - ).to.revertedWith('InvalidRedeemFromLtvPercent') + ).to.revertedWithCustomError(osTokenConfig, 'InvalidRedeemFromLtvPercent') }) it('can disable redeems for all positions', async () => { await expect( - osTokenConfig.connect(owner).updateConfig({ + osTokenConfig.connect(dao).updateConfig({ ...newConfig, redeemFromLtvPercent: MAX_UINT16, redeemToLtvPercent: MAX_UINT16, @@ -71,53 +65,53 @@ describe('OsTokenConfig', () => { it('can enable redeems for all positions', async () => { await expect( osTokenConfig - .connect(owner) + .connect(dao) .updateConfig({ ...newConfig, redeemFromLtvPercent: MAX_UINT16, redeemToLtvPercent: 0 }) ).to.emit(osTokenConfig, 'OsTokenConfigUpdated') }) it('fails with invalid liqThresholdPercent', async () => { await expect( - osTokenConfig.connect(owner).updateConfig({ ...newConfig, liqThresholdPercent: 0 }) - ).to.revertedWith('InvalidLiqThresholdPercent') + osTokenConfig.connect(dao).updateConfig({ ...newConfig, liqThresholdPercent: 0 }) + ).to.revertedWithCustomError(osTokenConfig, 'InvalidLiqThresholdPercent') await expect( - osTokenConfig.connect(owner).updateConfig({ ...newConfig, liqThresholdPercent: 10000 }) - ).to.revertedWith('InvalidLiqThresholdPercent') + osTokenConfig.connect(dao).updateConfig({ ...newConfig, liqThresholdPercent: 10000 }) + ).to.revertedWithCustomError(osTokenConfig, 'InvalidLiqThresholdPercent') }) it('fails with invalid liqBonusPercent', async () => { await expect( - osTokenConfig.connect(owner).updateConfig({ ...newConfig, liqBonusPercent: 9999 }) - ).to.revertedWith('InvalidLiqBonusPercent') + osTokenConfig.connect(dao).updateConfig({ ...newConfig, liqBonusPercent: 9999 }) + ).to.revertedWithCustomError(osTokenConfig, 'InvalidLiqBonusPercent') await expect( osTokenConfig - .connect(owner) + .connect(dao) .updateConfig({ ...newConfig, liqThresholdPercent: 9500, liqBonusPercent: 11000 }) - ).to.revertedWith('InvalidLiqBonusPercent') + ).to.revertedWithCustomError(osTokenConfig, 'InvalidLiqBonusPercent') }) it('can disable liqBonusPercent', async () => { await expect( - osTokenConfig.connect(owner).updateConfig({ ...newConfig, liqBonusPercent: 10000 }) + osTokenConfig.connect(dao).updateConfig({ ...newConfig, liqBonusPercent: 10000 }) ).to.emit(osTokenConfig, 'OsTokenConfigUpdated') }) it('fails with invalid ltvPercent', async () => { await expect( - osTokenConfig.connect(owner).updateConfig({ ...newConfig, ltvPercent: 0 }) - ).to.revertedWith('InvalidLtvPercent') + osTokenConfig.connect(dao).updateConfig({ ...newConfig, ltvPercent: 0 }) + ).to.revertedWithCustomError(osTokenConfig, 'InvalidLtvPercent') await expect( osTokenConfig - .connect(owner) + .connect(dao) .updateConfig({ ...newConfig, ltvPercent: newConfig.liqThresholdPercent + 1 }) - ).to.revertedWith('InvalidLtvPercent') + ).to.revertedWithCustomError(osTokenConfig, 'InvalidLtvPercent') }) it('owner can update config', async () => { - const tx = await osTokenConfig.connect(owner).updateConfig(newConfig) + const tx = await osTokenConfig.connect(dao).updateConfig(newConfig) await expect(tx) .to.emit(osTokenConfig, 'OsTokenConfigUpdated') .withArgs( diff --git a/test/OwnMevEscrow.spec.ts b/test/OwnMevEscrow.spec.ts index 888b1797..aea75a7b 100644 --- a/test/OwnMevEscrow.spec.ts +++ b/test/OwnMevEscrow.spec.ts @@ -1,9 +1,8 @@ import { ethers } from 'hardhat' import { ContractFactory, Wallet } from 'ethers' -import { OwnMevEscrow } from '../typechain-types' +import { OwnMevEscrow__factory } from '../typechain-types' import snapshotGasCost from './shared/snapshotGasCost' import { expect } from './shared/expect' -import { parseEther } from 'ethers/lib/utils' describe('OwnMevEscrow', () => { let ownMevEscrowFactory: ContractFactory @@ -15,26 +14,33 @@ describe('OwnMevEscrow', () => { }) it('vault deployment gas', async () => { - const tx = await ownMevEscrowFactory.deploy(vault.address) - await snapshotGasCost(tx.deployTransaction) + const contract = await ownMevEscrowFactory.deploy(await vault.getAddress()) + await snapshotGasCost(contract.deploymentTransaction() as any) }) it('only vault can withdraw assets', async () => { - const mevEscrow = (await ownMevEscrowFactory.deploy(vault.address)) as OwnMevEscrow - await expect(mevEscrow.connect(other).harvest()).to.be.revertedWith('HarvestFailed') + const tx = await ethers.deployContract('OwnMevEscrow', [await vault.getAddress()]) + const contract = await tx.waitForDeployment() + const ownMevEscrow = OwnMevEscrow__factory.connect(await contract.getAddress(), other) + await expect(ownMevEscrow.connect(other).harvest()).to.be.revertedWithCustomError( + ownMevEscrow, + 'HarvestFailed' + ) }) it('emits event on transfers', async () => { - const value = parseEther('1') - const mevEscrow = (await ownMevEscrowFactory.deploy(vault.address)) as OwnMevEscrow + const value = ethers.parseEther('1') + const tx = await ethers.deployContract('OwnMevEscrow', [await vault.getAddress()]) + const contract = await tx.waitForDeployment() + const ownMevEscrow = OwnMevEscrow__factory.connect(await contract.getAddress(), other) await expect( other.sendTransaction({ - to: mevEscrow.address, + to: await ownMevEscrow.getAddress(), value: value, }) ) - .to.be.emit(mevEscrow, 'MevReceived') + .to.be.emit(ownMevEscrow, 'MevReceived') .withArgs(value) }) }) diff --git a/test/PriceOracle.test.ts b/test/PriceOracle.test.ts index 3b23df12..8d34d183 100644 --- a/test/PriceOracle.test.ts +++ b/test/PriceOracle.test.ts @@ -1,6 +1,6 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthVault, IKeeperRewards, OsToken, PriceFeed } from '../typechain-types' import { expect } from './shared/expect' import { createPriceFeed, ethVaultFixture } from './shared/fixtures' @@ -8,26 +8,21 @@ import { ONE_DAY, ZERO_ADDRESS } from './shared/constants' import { collateralizeEthVault, getRewardsRootProof, updateRewards } from './shared/rewards' import { increaseTime } from './shared/utils' -const createFixtureLoader = waffle.createFixtureLoader - describe('PriceFeed', () => { - const shares = parseEther('2') - const osTokenShares = parseEther('1') - const unlockedMevReward = parseEther('0') + const shares = ethers.parseEther('2') + const osTokenShares = ethers.parseEther('1') + const unlockedMevReward = ethers.parseEther('0') const description = 'osETH/ETH' const vaultParams = { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', } let sender: Wallet, admin: Wallet, dao: Wallet let osToken: OsToken, priceFeed: PriceFeed, vault: EthVault - let loadFixture: ReturnType - before('create fixture loader', async () => { ;[sender, dao, admin] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([dao]) }) beforeEach('deploy fixture', async () => { @@ -41,16 +36,16 @@ describe('PriceFeed', () => { await collateralizeEthVault(vault, fixture.keeper, fixture.validatorsRegistry, admin) await vault.connect(sender).deposit(sender.address, ZERO_ADDRESS, { value: shares }) - const reward = parseEther('1') + const reward = ethers.parseEther('1') const tree = await updateRewards(fixture.keeper, [ - { vault: vault.address, reward, unlockedMevReward }, + { vault: await vault.getAddress(), reward, unlockedMevReward }, ]) const harvestParams: IKeeperRewards.HarvestParamsStruct = { rewardsRoot: tree.root, reward, unlockedMevReward: unlockedMevReward, proof: getRewardsRootProof(tree, { - vault: vault.address, + vault: await vault.getAddress(), unlockedMevReward: unlockedMevReward, reward, }), @@ -59,7 +54,7 @@ describe('PriceFeed', () => { }) it('has osToken address', async () => { - expect(await priceFeed.osToken()).to.eq(osToken.address) + expect(await priceFeed.osToken()).to.eq(await osToken.getAddress()) }) it('has decimals', async () => { @@ -79,7 +74,7 @@ describe('PriceFeed', () => { }) it('works with zero supply', async () => { - const expectedValue = parseEther('1') + const expectedValue = ethers.parseEther('1') expect(await osToken.totalSupply()).to.eq(0) expect(await priceFeed.latestAnswer()).to.eq(expectedValue) @@ -90,7 +85,7 @@ describe('PriceFeed', () => { it('increments over time', async () => { await vault.connect(sender).mintOsToken(sender.address, osTokenShares, ZERO_ADDRESS) const value = await priceFeed.latestAnswer() - expect(value).to.eq(parseEther('1')) + expect(value).to.eq(ethers.parseEther('1')) let latestRoundData = await priceFeed.latestRoundData() expect(latestRoundData[1]).to.eq(value) diff --git a/test/RewardSplitter.spec.ts b/test/RewardSplitter.spec.ts index a9062f72..29600109 100644 --- a/test/RewardSplitter.spec.ts +++ b/test/RewardSplitter.spec.ts @@ -1,35 +1,36 @@ -import { ethers, waffle } from 'hardhat' -import { BigNumber, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' -import { EthErc20Vault, EthVault, Keeper, RewardSplitter } from '../typechain-types' +import { ethers } from 'hardhat' +import { Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { + EthErc20Vault, + EthVault, + Keeper, + RewardSplitter, + RewardSplitter__factory, +} from '../typechain-types' import { createRewardSplitterFactory, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' import { PANIC_CODES, SECURITY_DEPOSIT, ZERO_ADDRESS } from './shared/constants' import { collateralizeEthVault, getRewardsRootProof, updateRewards } from './shared/rewards' import snapshotGasCost from './shared/snapshotGasCost' -const createFixtureLoader = waffle.createFixtureLoader - describe('RewardSplitter', () => { - let admin: Wallet, owner: Wallet, other: Wallet + let admin: Wallet, other: Wallet let vault: EthVault, keeper: Keeper, rewardSplitter: RewardSplitter, erc20Vault: EthErc20Vault - let loadFixture: ReturnType - before('create fixture loader', async () => { - ;[owner, admin, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) + ;[admin, other] = (await (ethers as any).getSigners()).slice(1, 3) }) beforeEach(async () => { const fixture = await loadFixture(ethVaultFixture) vault = await fixture.createEthVault(admin, { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', }) erc20Vault = await fixture.createEthErc20Vault(admin, { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', name: 'SW ETH Vault', @@ -42,24 +43,23 @@ describe('RewardSplitter', () => { const rewardSplitterFactory = await createRewardSplitterFactory() const rewardSplitterAddress = await rewardSplitterFactory .connect(admin) - .callStatic.createRewardSplitter(vault.address) - await rewardSplitterFactory.connect(admin).createRewardSplitter(vault.address) - const factory = await ethers.getContractFactory('RewardSplitter') - rewardSplitter = factory.attach(rewardSplitterAddress) as RewardSplitter - await vault.connect(admin).setFeeRecipient(rewardSplitter.address) + .createRewardSplitter.staticCall(await vault.getAddress()) + await rewardSplitterFactory.connect(admin).createRewardSplitter(await vault.getAddress()) + rewardSplitter = RewardSplitter__factory.connect(rewardSplitterAddress, admin) + await vault.connect(admin).setFeeRecipient(rewardSplitterAddress) }) describe('increase shares', () => { it('fails with zero shares', async () => { await expect( rewardSplitter.connect(admin).increaseShares(other.address, 0) - ).to.be.revertedWith('InvalidAmount') + ).to.be.revertedWithCustomError(rewardSplitter, 'InvalidAmount') }) it('fails with zero account', async () => { await expect( rewardSplitter.connect(admin).increaseShares(ZERO_ADDRESS, 1) - ).to.be.revertedWith('InvalidAccount') + ).to.be.revertedWithCustomError(rewardSplitter, 'InvalidAccount') }) it('fails by not owner', async () => { @@ -72,44 +72,56 @@ describe('RewardSplitter', () => { await rewardSplitter.connect(admin).increaseShares(other.address, 1) await updateRewards( keeper, - [{ vault: vault.address, reward: parseEther('1'), unlockedMevReward: 0 }], + [ + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1'), + unlockedMevReward: 0n, + }, + ], 0 ) await updateRewards( keeper, - [{ vault: vault.address, reward: parseEther('2'), unlockedMevReward: 0 }], + [ + { + vault: await vault.getAddress(), + reward: ethers.parseEther('2'), + unlockedMevReward: 0n, + }, + ], 0 ) await expect( rewardSplitter.connect(admin).increaseShares(other.address, 1) - ).to.be.revertedWith('NotHarvested') + ).to.be.revertedWithCustomError(rewardSplitter, 'NotHarvested') }) it('increasing shares does not affect others rewards', async () => { await rewardSplitter.connect(admin).increaseShares(other.address, 100) await vault.deposit(other.address, ZERO_ADDRESS, { - value: parseEther('10').sub(SECURITY_DEPOSIT), + value: ethers.parseEther('10') - SECURITY_DEPOSIT, }) - const totalReward = parseEther('1') - const fee = parseEther('0.1') + const totalReward = ethers.parseEther('1') + const fee = ethers.parseEther('0.1') const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: totalReward, unlockedMevReward: 0 }], + [{ vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: 0n }], 0 ) await vault.updateState({ rewardsRoot: tree.root, reward: totalReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, reward: totalReward, }), }) const feeShares = await vault.convertToShares(fee) - expect(await vault.feeRecipient()).to.eq(rewardSplitter.address) - expect(await vault.getShares(rewardSplitter.address)).to.eq(feeShares) + expect(await vault.feeRecipient()).to.eq(await rewardSplitter.getAddress()) + expect(await vault.getShares(await rewardSplitter.getAddress())).to.eq(feeShares) await rewardSplitter.connect(admin).increaseShares(admin.address, 100) expect(await rewardSplitter.rewardsOf(other.address)).to.eq(feeShares) @@ -137,13 +149,13 @@ describe('RewardSplitter', () => { it('fails with zero shares', async () => { await expect( rewardSplitter.connect(admin).decreaseShares(other.address, 0) - ).to.be.revertedWith('InvalidAmount') + ).to.be.revertedWithCustomError(rewardSplitter, 'InvalidAmount') }) it('fails with zero account', async () => { await expect( rewardSplitter.connect(admin).decreaseShares(ZERO_ADDRESS, 1) - ).to.be.revertedWith('InvalidAccount') + ).to.be.revertedWithCustomError(rewardSplitter, 'InvalidAccount') }) it('fails by not owner', async () => { @@ -155,54 +167,66 @@ describe('RewardSplitter', () => { it('fails with amount larger than balance', async () => { await expect( rewardSplitter.connect(admin).decreaseShares(other.address, shares + 1) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) }) it('fails when vault not harvested', async () => { await updateRewards( keeper, - [{ vault: vault.address, reward: parseEther('1'), unlockedMevReward: 0 }], + [ + { + vault: await vault.getAddress(), + reward: ethers.parseEther('1'), + unlockedMevReward: 0n, + }, + ], 0 ) await updateRewards( keeper, - [{ vault: vault.address, reward: parseEther('2'), unlockedMevReward: 0 }], + [ + { + vault: await vault.getAddress(), + reward: ethers.parseEther('2'), + unlockedMevReward: 0n, + }, + ], 0 ) await expect( rewardSplitter.connect(admin).decreaseShares(other.address, 1) - ).to.be.revertedWith('NotHarvested') + ).to.be.revertedWithCustomError(rewardSplitter, 'NotHarvested') }) it('decreasing shares does not affect rewards', async () => { await rewardSplitter.connect(admin).increaseShares(admin.address, shares) await vault.deposit(other.address, ZERO_ADDRESS, { - value: parseEther('10').sub(SECURITY_DEPOSIT), + value: ethers.parseEther('10') - SECURITY_DEPOSIT, }) - const totalReward = parseEther('1') - const fee = parseEther('0.1') + const totalReward = ethers.parseEther('1') + const fee = ethers.parseEther('0.1') const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: totalReward, unlockedMevReward: 0 }], + [{ vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: 0n }], 0 ) await vault.updateState({ rewardsRoot: tree.root, reward: totalReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, reward: totalReward, }), }) const feeShares = await vault.convertToShares(fee) - expect(await vault.feeRecipient()).to.eq(rewardSplitter.address) - expect(await vault.getShares(rewardSplitter.address)).to.eq(feeShares) + expect(await vault.feeRecipient()).to.eq(await rewardSplitter.getAddress()) + expect(await vault.getShares(await rewardSplitter.getAddress())).to.eq(feeShares) await rewardSplitter.connect(admin).decreaseShares(admin.address, 1) - expect(await rewardSplitter.rewardsOf(other.address)).to.eq(feeShares.div(2)) - expect(await rewardSplitter.rewardsOf(admin.address)).to.eq(feeShares.div(2)) + expect(await rewardSplitter.rewardsOf(other.address)).to.eq(feeShares / 2n) + expect(await rewardSplitter.rewardsOf(admin.address)).to.eq(feeShares / 2n) }) it('owner can decrease shares', async () => { @@ -217,25 +241,25 @@ describe('RewardSplitter', () => { }) describe('sync rewards', () => { - const shares = 100 + const shares = 100n beforeEach(async () => { await rewardSplitter.connect(admin).increaseShares(other.address, shares) }) it('does not sync rewards when up to date', async () => { - const totalReward = parseEther('1') + const totalReward = ethers.parseEther('1') const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: totalReward, unlockedMevReward: 0 }], + [{ vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: 0n }], 0 ) await vault.updateState({ rewardsRoot: tree.root, reward: totalReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, reward: totalReward, }), }) @@ -247,19 +271,19 @@ describe('RewardSplitter', () => { it('does not sync rewards with zero total shares', async () => { await rewardSplitter.connect(admin).decreaseShares(other.address, shares) - const totalReward = parseEther('1') + const totalReward = ethers.parseEther('1') const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: totalReward, unlockedMevReward: 0 }], + [{ vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: 0n }], 0 ) await vault.updateState({ rewardsRoot: tree.root, reward: totalReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, reward: totalReward, }), }) @@ -269,22 +293,22 @@ describe('RewardSplitter', () => { it('anyone can sync rewards', async () => { await vault.deposit(other.address, ZERO_ADDRESS, { - value: parseEther('10').sub(SECURITY_DEPOSIT), + value: ethers.parseEther('10') - SECURITY_DEPOSIT, }) - const totalReward = parseEther('1') - const fee = parseEther('0.1') + const totalReward = ethers.parseEther('1') + const fee = ethers.parseEther('0.1') const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: totalReward, unlockedMevReward: 0 }], + [{ vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: 0n }], 0 ) await vault.updateState({ rewardsRoot: tree.root, reward: totalReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, reward: totalReward, }), }) @@ -293,30 +317,30 @@ describe('RewardSplitter', () => { const receipt = await rewardSplitter.syncRewards() await expect(receipt) .to.emit(rewardSplitter, 'RewardsSynced') - .withArgs(feeShares, feeShares.mul(parseEther('1')).div(shares)) + .withArgs(feeShares, (feeShares * ethers.parseEther('1')) / shares) await snapshotGasCost(receipt) }) }) describe('withdraw rewards', () => { const shares = 100 - let rewards: BigNumber + let rewards: bigint beforeEach(async () => { await rewardSplitter.connect(admin).increaseShares(other.address, shares) - const totalReward = parseEther('1') + const totalReward = ethers.parseEther('1') const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: totalReward, unlockedMevReward: 0 }], + [{ vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: 0n }], 0 ) await vault.updateState({ rewardsRoot: tree.root, reward: totalReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, reward: totalReward, }), }) @@ -334,27 +358,26 @@ describe('RewardSplitter', () => { const rewardSplitterFactory = await createRewardSplitterFactory() const rewardSplitterAddress = await rewardSplitterFactory .connect(admin) - .callStatic.createRewardSplitter(erc20Vault.address) - await rewardSplitterFactory.connect(admin).createRewardSplitter(erc20Vault.address) + .createRewardSplitter.staticCall(await erc20Vault.getAddress()) + await rewardSplitterFactory.connect(admin).createRewardSplitter(await erc20Vault.getAddress()) // collateralize rewards splitter - const factory = await ethers.getContractFactory('RewardSplitter') - const rewardSplitter = factory.attach(rewardSplitterAddress) as RewardSplitter - await erc20Vault.connect(admin).setFeeRecipient(rewardSplitter.address) + const rewardSplitter = RewardSplitter__factory.connect(rewardSplitterAddress, admin) + await erc20Vault.connect(admin).setFeeRecipient(await rewardSplitter.getAddress()) await rewardSplitter.connect(admin).increaseShares(other.address, shares) - const totalReward = parseEther('1') + const totalReward = ethers.parseEther('1') const tree = await updateRewards( keeper, - [{ vault: erc20Vault.address, reward: totalReward, unlockedMevReward: 0 }], + [{ vault: await erc20Vault.getAddress(), reward: totalReward, unlockedMevReward: 0n }], 0 ) await erc20Vault.updateState({ rewardsRoot: tree.root, reward: totalReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: erc20Vault.address, - unlockedMevReward: 0, + vault: await erc20Vault.getAddress(), + unlockedMevReward: 0n, reward: totalReward, }), }) @@ -370,24 +393,24 @@ describe('RewardSplitter', () => { // second claim should fail await expect( rewardSplitter.connect(other).claimVaultTokens(rewards, other.address) - ).to.be.revertedWith(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) + ).to.be.revertedWithPanic(PANIC_CODES.ARITHMETIC_UNDER_OR_OVERFLOW) await snapshotGasCost(receipt) }) it('can enter exit queue with multicall', async () => { await vault.deposit(other.address, ZERO_ADDRESS, { - value: parseEther('10').sub(SECURITY_DEPOSIT), + value: ethers.parseEther('10') - SECURITY_DEPOSIT, }) - let totalReward = parseEther('2') + let totalReward = ethers.parseEther('2') await updateRewards( keeper, - [{ vault: vault.address, reward: totalReward, unlockedMevReward: 0 }], + [{ vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: 0n }], 0 ) - totalReward = parseEther('3') + totalReward = ethers.parseEther('3') const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: totalReward, unlockedMevReward: 0 }], + [{ vault: await vault.getAddress(), reward: totalReward, unlockedMevReward: 0n }], 0 ) @@ -396,17 +419,17 @@ describe('RewardSplitter', () => { { rewardsRoot: tree.root, reward: totalReward, - unlockedMevReward: 0, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, + vault: await vault.getAddress(), + unlockedMevReward: 0n, reward: totalReward, }), }, ]), rewardSplitter.interface.encodeFunctionData('syncRewards'), ] - const result = await rewardSplitter.callStatic.multicall([ + const result = await rewardSplitter.multicall.staticCall([ ...calls, rewardSplitter.interface.encodeFunctionData('rewardsOf', [other.address]), ]) diff --git a/test/RewardSplitterFactory.spec.ts b/test/RewardSplitterFactory.spec.ts index 2327d838..347e459f 100644 --- a/test/RewardSplitterFactory.spec.ts +++ b/test/RewardSplitterFactory.spec.ts @@ -1,28 +1,28 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' -import { EthVault, RewardSplitter, RewardSplitterFactory } from '../typechain-types' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' +import { + EthVault, + RewardSplitterFactory__factory, + RewardSplitter__factory, + RewardSplitterFactory, +} from '../typechain-types' import snapshotGasCost from './shared/snapshotGasCost' import { createRewardSplitterFactory, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' -const createFixtureLoader = waffle.createFixtureLoader - describe('RewardSplitterFactory', () => { - let admin: Wallet, owner: Wallet + let admin: Wallet let vault: EthVault, rewardSplitterFactory: RewardSplitterFactory - let loadFixture: ReturnType - before('create fixture loader', async () => { - ;[owner, admin] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) + ;[admin] = (await (ethers as any).getSigners()).slice(1, 2) }) beforeEach(async () => { const fixture = await loadFixture(ethVaultFixture) vault = await fixture.createEthVault(admin, { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', }) @@ -30,33 +30,38 @@ describe('RewardSplitterFactory', () => { }) it('splitter deployment gas', async () => { - const receipt = await rewardSplitterFactory.connect(admin).createRewardSplitter(vault.address) + const receipt = await rewardSplitterFactory + .connect(admin) + .createRewardSplitter(await vault.getAddress()) await snapshotGasCost(receipt) }) it('factory deploys correctly', async () => { let factory = await ethers.getContractFactory('RewardSplitter') const rewardSplitterImpl = await factory.deploy() + const rewardSplitterImplAddress = await rewardSplitterImpl.getAddress() factory = await ethers.getContractFactory('RewardSplitterFactory') - const rewardsFactory = (await factory.deploy( - rewardSplitterImpl.address - )) as RewardSplitterFactory - expect(await rewardsFactory.implementation()).to.eq(rewardSplitterImpl.address) + const rewardsFactory = RewardSplitterFactory__factory.connect( + await (await factory.deploy(rewardSplitterImplAddress)).getAddress(), + admin + ) + expect(await rewardsFactory.implementation()).to.eq(rewardSplitterImplAddress) }) it('splitter deploys correctly', async () => { const rewardSplitterAddress = await rewardSplitterFactory .connect(admin) - .callStatic.createRewardSplitter(vault.address) - const receipt = await rewardSplitterFactory.connect(admin).createRewardSplitter(vault.address) + .createRewardSplitter.staticCall(await vault.getAddress()) + const receipt = await rewardSplitterFactory + .connect(admin) + .createRewardSplitter(await vault.getAddress()) await expect(receipt) .to.emit(rewardSplitterFactory, 'RewardSplitterCreated') - .withArgs(admin.address, vault.address, rewardSplitterAddress) + .withArgs(admin.address, await vault.getAddress(), rewardSplitterAddress) - const factory = await ethers.getContractFactory('RewardSplitter') - const rewardSplitter = (await factory.attach(rewardSplitterAddress)) as RewardSplitter - expect(await rewardSplitter.vault()).to.eq(vault.address) + const rewardSplitter = RewardSplitter__factory.connect(rewardSplitterAddress, admin) + expect(await rewardSplitter.vault()).to.eq(await vault.getAddress()) expect(await rewardSplitter.owner()).to.eq(admin.address) expect(await rewardSplitter.totalShares()).to.eq(0) }) diff --git a/test/SharedMevEscrow.spec.ts b/test/SharedMevEscrow.spec.ts index a42b8bd7..b4dc3887 100644 --- a/test/SharedMevEscrow.spec.ts +++ b/test/SharedMevEscrow.spec.ts @@ -1,45 +1,38 @@ -import { ethers, waffle } from 'hardhat' +import { ethers } from 'hardhat' import { Wallet } from 'ethers' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { SharedMevEscrow, VaultsRegistry } from '../typechain-types' import snapshotGasCost from './shared/snapshotGasCost' import { expect } from './shared/expect' -import { parseEther } from 'ethers/lib/utils' -import { ethVaultFixture } from './shared/fixtures' -const createFixtureLoader = waffle.createFixtureLoader +import { ethVaultFixture } from './shared/fixtures' describe('SharedMevEscrow', () => { - let owner: Wallet, other: Wallet, sharedMevEscrow: SharedMevEscrow, vaultsRegistry: VaultsRegistry - - let loadFixture: ReturnType - - before('create fixture loader', async () => { - ;[owner, other] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) - }) + let other: Wallet, sharedMevEscrow: SharedMevEscrow, vaultsRegistry: VaultsRegistry beforeEach('deploy fixture', async () => { + ;[other] = (await (ethers as any).getSigners()).slice(1, 2) ;({ sharedMevEscrow, vaultsRegistry } = await loadFixture(ethVaultFixture)) }) it('vault deployment gas', async () => { const sharedMevEscrowFactory = await ethers.getContractFactory('SharedMevEscrow') - const tx = await sharedMevEscrowFactory.deploy(vaultsRegistry.address) - await snapshotGasCost(tx.deployTransaction) + const tx = await sharedMevEscrowFactory.deploy(await vaultsRegistry.getAddress()) + await snapshotGasCost(tx.deploymentTransaction() as any) }) it('only vault can withdraw assets', async () => { - await expect(sharedMevEscrow.connect(other).harvest(parseEther('1'))).to.be.revertedWith( - 'HarvestFailed' - ) + await expect( + sharedMevEscrow.connect(other).harvest(ethers.parseEther('1')) + ).to.be.revertedWithCustomError(sharedMevEscrow, 'HarvestFailed') }) it('emits event on transfers', async () => { - const value = parseEther('1') + const value = ethers.parseEther('1') await expect( other.sendTransaction({ - to: sharedMevEscrow.address, + to: await sharedMevEscrow.getAddress(), value: value, }) ) diff --git a/test/VaultsRegistry.spec.ts b/test/VaultsRegistry.spec.ts index bab6e0aa..d114c16c 100644 --- a/test/VaultsRegistry.spec.ts +++ b/test/VaultsRegistry.spec.ts @@ -1,6 +1,6 @@ -import { ethers, upgrades, waffle } from 'hardhat' +import { ethers, upgrades } from 'hardhat' import { Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { loadFixture } from '@nomicfoundation/hardhat-toolbox/network-helpers' import { EthVaultFactory, VaultsRegistry } from '../typechain-types' import { encodeEthVaultInitParams, ethVaultFixture } from './shared/fixtures' import { expect } from './shared/expect' @@ -8,27 +8,21 @@ import snapshotGasCost from './shared/snapshotGasCost' import { EXITING_ASSETS_MIN_DELAY, SECURITY_DEPOSIT, ZERO_ADDRESS } from './shared/constants' import { extractVaultAddress } from './shared/utils' -const createFixtureLoader = waffle.createFixtureLoader - describe('VaultsRegistry', () => { const vaultParams = { - capacity: parseEther('1000'), + capacity: ethers.parseEther('1000'), feePercent: 1000, metadataIpfsHash: 'bafkreidivzimqfqtoqxkrpge6bjyhlvxqs3rhe73owtmdulaxr5do5in7u', } - let owner: Wallet, admin: Wallet - let loadFixture: ReturnType + let dao: Wallet, admin: Wallet + let vaultsRegistry: VaultsRegistry let ethVaultFactory: EthVaultFactory let newVaultImpl: string - before('create fixture loader', async () => { - ;[owner, admin] = await (ethers as any).getSigners() - loadFixture = createFixtureLoader([owner]) - }) - beforeEach('deploy fixture', async () => { + ;[dao, admin] = await (ethers as any).getSigners() const fixture = await loadFixture(ethVaultFixture) ethVaultFactory = fixture.ethVaultFactory vaultsRegistry = fixture.vaultsRegistry @@ -37,42 +31,42 @@ describe('VaultsRegistry', () => { newVaultImpl = (await upgrades.deployImplementation(ethVaultMock, { unsafeAllow: ['delegatecall'], constructorArgs: [ - fixture.keeper.address, - fixture.vaultsRegistry.address, - fixture.validatorsRegistry.address, - fixture.osToken.address, - fixture.osTokenConfig.address, - fixture.sharedMevEscrow.address, + await fixture.keeper.getAddress(), + await fixture.vaultsRegistry.getAddress(), + await fixture.validatorsRegistry.getAddress(), + await fixture.osToken.getAddress(), + await fixture.osTokenConfig.getAddress(), + await fixture.sharedMevEscrow.getAddress(), EXITING_ASSETS_MIN_DELAY, ], })) as string }) it('fails to add a vault if not a factory or owner', async () => { - await expect(vaultsRegistry.connect(admin).addVault(admin.address)).revertedWith('AccessDenied') + await expect(vaultsRegistry.connect(admin).addVault(admin.address)).revertedWithCustomError( + vaultsRegistry, + 'AccessDenied' + ) }) it('factory can add vault', async () => { const tx = await ethVaultFactory .connect(admin) .createVault(encodeEthVaultInitParams(vaultParams), false, { value: SECURITY_DEPOSIT }) - const receipt = await tx.wait() - const vaultAddress = extractVaultAddress(receipt) + const vaultAddress = await extractVaultAddress(tx) await expect(tx) .to.emit(vaultsRegistry, 'VaultAdded') - .withArgs(ethVaultFactory.address, vaultAddress) + .withArgs(await ethVaultFactory.getAddress(), vaultAddress) expect(await vaultsRegistry.vaults(vaultAddress)).to.be.eq(true) - await snapshotGasCost(receipt) + await snapshotGasCost(tx) }) it('owner can add vault', async () => { // add zero address as newVaultImpl is implementation, not proxy - await vaultsRegistry.connect(owner).addVaultImpl(ZERO_ADDRESS) - const receipt = await vaultsRegistry.connect(owner).addVault(newVaultImpl) - await expect(receipt) - .to.emit(vaultsRegistry, 'VaultAdded') - .withArgs(owner.address, newVaultImpl) + await vaultsRegistry.connect(dao).addVaultImpl(ZERO_ADDRESS) + const receipt = await vaultsRegistry.connect(dao).addVault(newVaultImpl) + await expect(receipt).to.emit(vaultsRegistry, 'VaultAdded').withArgs(dao.address, newVaultImpl) expect(await vaultsRegistry.vaults(newVaultImpl)).to.be.eq(true) await snapshotGasCost(receipt) }) @@ -84,82 +78,88 @@ describe('VaultsRegistry', () => { }) it('owner can register implementation contract', async () => { - const receipt = await vaultsRegistry.connect(owner).addVaultImpl(newVaultImpl) + const receipt = await vaultsRegistry.connect(dao).addVaultImpl(newVaultImpl) await expect(receipt).to.emit(vaultsRegistry, 'VaultImplAdded').withArgs(newVaultImpl) expect(await vaultsRegistry.vaultImpls(newVaultImpl)).to.be.eq(true) await snapshotGasCost(receipt) }) it('cannot add the same implementation contract', async () => { - await vaultsRegistry.connect(owner).addVaultImpl(newVaultImpl) - await expect(vaultsRegistry.connect(owner).addVaultImpl(newVaultImpl)).revertedWith( + await vaultsRegistry.connect(dao).addVaultImpl(newVaultImpl) + await expect(vaultsRegistry.connect(dao).addVaultImpl(newVaultImpl)).revertedWithCustomError( + vaultsRegistry, 'AlreadyAdded' ) }) it('not owner cannot remove implementation', async () => { - await vaultsRegistry.connect(owner).addVaultImpl(newVaultImpl) + await vaultsRegistry.connect(dao).addVaultImpl(newVaultImpl) await expect(vaultsRegistry.connect(admin).removeVaultImpl(newVaultImpl)).revertedWith( 'Ownable: caller is not the owner' ) }) it('owner can remove implementation', async () => { - await vaultsRegistry.connect(owner).addVaultImpl(newVaultImpl) - const receipt = await vaultsRegistry.connect(owner).removeVaultImpl(newVaultImpl) + await vaultsRegistry.connect(dao).addVaultImpl(newVaultImpl) + const receipt = await vaultsRegistry.connect(dao).removeVaultImpl(newVaultImpl) await expect(receipt).to.emit(vaultsRegistry, 'VaultImplRemoved').withArgs(newVaultImpl) expect(await vaultsRegistry.vaultImpls(newVaultImpl)).to.be.eq(false) await snapshotGasCost(receipt) }) it('cannot remove already removed implementation', async () => { - await expect(vaultsRegistry.connect(owner).removeVaultImpl(newVaultImpl)).revertedWith( + await expect(vaultsRegistry.connect(dao).removeVaultImpl(newVaultImpl)).revertedWithCustomError( + vaultsRegistry, 'AlreadyRemoved' ) expect(await vaultsRegistry.vaults(newVaultImpl)).to.be.eq(false) }) it('not owner cannot add factory', async () => { - await expect(vaultsRegistry.connect(admin).addFactory(ethVaultFactory.address)).revertedWith( - 'Ownable: caller is not the owner' - ) + await expect( + vaultsRegistry.connect(admin).addFactory(await ethVaultFactory.getAddress()) + ).revertedWith('Ownable: caller is not the owner') }) it('owner can add factory', async () => { - await vaultsRegistry.connect(owner).removeFactory(ethVaultFactory.address) - const receipt = await vaultsRegistry.connect(owner).addFactory(ethVaultFactory.address) - await expect(receipt).to.emit(vaultsRegistry, 'FactoryAdded').withArgs(ethVaultFactory.address) - expect(await vaultsRegistry.factories(ethVaultFactory.address)).to.be.eq(true) + await vaultsRegistry.connect(dao).removeFactory(await ethVaultFactory.getAddress()) + const receipt = await vaultsRegistry.connect(dao).addFactory(await ethVaultFactory.getAddress()) + await expect(receipt) + .to.emit(vaultsRegistry, 'FactoryAdded') + .withArgs(await ethVaultFactory.getAddress()) + expect(await vaultsRegistry.factories(await ethVaultFactory.getAddress())).to.be.eq(true) await snapshotGasCost(receipt) }) it('cannot add already whitelisted factory', async () => { - await expect(vaultsRegistry.connect(owner).addFactory(ethVaultFactory.address)).revertedWith( - 'AlreadyAdded' - ) - expect(await vaultsRegistry.factories(ethVaultFactory.address)).to.be.eq(true) + await expect( + vaultsRegistry.connect(dao).addFactory(await ethVaultFactory.getAddress()) + ).revertedWithCustomError(vaultsRegistry, 'AlreadyAdded') + expect(await vaultsRegistry.factories(await ethVaultFactory.getAddress())).to.be.eq(true) }) it('not owner cannot remove factory', async () => { - await expect(vaultsRegistry.connect(admin).removeFactory(ethVaultFactory.address)).revertedWith( - 'Ownable: caller is not the owner' - ) + await expect( + vaultsRegistry.connect(admin).removeFactory(await ethVaultFactory.getAddress()) + ).revertedWith('Ownable: caller is not the owner') }) it('owner can remove factory', async () => { - const receipt = await vaultsRegistry.connect(owner).removeFactory(ethVaultFactory.address) + const receipt = await vaultsRegistry + .connect(dao) + .removeFactory(await ethVaultFactory.getAddress()) await expect(receipt) .to.emit(vaultsRegistry, 'FactoryRemoved') - .withArgs(ethVaultFactory.address) - expect(await vaultsRegistry.factories(ethVaultFactory.address)).to.be.eq(false) + .withArgs(await ethVaultFactory.getAddress()) + expect(await vaultsRegistry.factories(await ethVaultFactory.getAddress())).to.be.eq(false) await snapshotGasCost(receipt) }) it('cannot remove already removed factory', async () => { - await vaultsRegistry.connect(owner).removeFactory(ethVaultFactory.address) - await expect(vaultsRegistry.connect(owner).removeFactory(ethVaultFactory.address)).revertedWith( - 'AlreadyRemoved' - ) - expect(await vaultsRegistry.factories(ethVaultFactory.address)).to.be.eq(false) + await vaultsRegistry.connect(dao).removeFactory(await ethVaultFactory.getAddress()) + await expect( + vaultsRegistry.connect(dao).removeFactory(await ethVaultFactory.getAddress()) + ).revertedWithCustomError(vaultsRegistry, 'AlreadyRemoved') + expect(await vaultsRegistry.factories(await ethVaultFactory.getAddress())).to.be.eq(false) }) }) diff --git a/test/__snapshots__/EthGenesisVault.spec.ts.snap b/test/__snapshots__/EthGenesisVault.spec.ts.snap index 725662ee..664071cf 100644 --- a/test/__snapshots__/EthGenesisVault.spec.ts.snap +++ b/test/__snapshots__/EthGenesisVault.spec.ts.snap @@ -24,14 +24,14 @@ Object { exports[`EthGenesisVault pulls assets on multiple validators registration 1`] = ` Object { "calldataByteLength": 3716, - "gasUsed": 667408, + "gasUsed": 667428, } `; exports[`EthGenesisVault pulls assets on single validator registration 1`] = ` Object { "calldataByteLength": 1444, - "gasUsed": 335694, + "gasUsed": 335764, } `; diff --git a/test/__snapshots__/EthVault.burn.spec.ts.snap b/test/__snapshots__/EthVault.burn.spec.ts.snap index 1d1d4e5c..f6cde6c9 100644 --- a/test/__snapshots__/EthVault.burn.spec.ts.snap +++ b/test/__snapshots__/EthVault.burn.spec.ts.snap @@ -1,5 +1,12 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`EthVault - burn burns osTokens 1`] = ` +Object { + "calldataByteLength": 36, + "gasUsed": 97149, +} +`; + exports[`EthVault - burn updates position accumulated fee 1`] = ` Object { "calldataByteLength": 36, diff --git a/test/__snapshots__/EthVault.mint.spec.ts.snap b/test/__snapshots__/EthVault.mint.spec.ts.snap index 5fd41a51..176e0aa1 100644 --- a/test/__snapshots__/EthVault.mint.spec.ts.snap +++ b/test/__snapshots__/EthVault.mint.spec.ts.snap @@ -3,20 +3,20 @@ exports[`EthVault - mint mints osTokens to the receiver 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 151803, + "gasUsed": 151791, } `; exports[`EthVault - mint updates position accumulated fee 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 151803, + "gasUsed": 151791, } `; exports[`EthVault - mint updates position accumulated fee 2`] = ` Object { "calldataByteLength": 100, - "gasUsed": 129848, + "gasUsed": 129836, } `; diff --git a/test/__snapshots__/EthVault.multicall.spec.ts.snap b/test/__snapshots__/EthVault.multicall.spec.ts.snap index cc976bca..9142a154 100644 --- a/test/__snapshots__/EthVault.multicall.spec.ts.snap +++ b/test/__snapshots__/EthVault.multicall.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - multicall can update state and queue for exit 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 164202, + "gasUsed": 164214, } `; exports[`EthVault - multicall can update state and queue for exit 2`] = ` Object { "calldataByteLength": 548, - "gasUsed": 137813, + "gasUsed": 137825, } `; diff --git a/test/__snapshots__/EthVault.register.spec.ts.snap b/test/__snapshots__/EthVault.register.spec.ts.snap index 2dcf827a..265e1aa3 100644 --- a/test/__snapshots__/EthVault.register.spec.ts.snap +++ b/test/__snapshots__/EthVault.register.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - register multiple validators succeeds 1`] = ` Object { "calldataByteLength": 3652, - "gasUsed": 708000, + "gasUsed": 707990, } `; exports[`EthVault - register single validator succeeds 1`] = ` Object { "calldataByteLength": 1444, - "gasUsed": 357127, + "gasUsed": 357107, } `; diff --git a/test/__snapshots__/EthVault.state.spec.ts.snap b/test/__snapshots__/EthVault.state.spec.ts.snap index 255dc010..49419060 100644 --- a/test/__snapshots__/EthVault.state.spec.ts.snap +++ b/test/__snapshots__/EthVault.state.spec.ts.snap @@ -17,6 +17,6 @@ Object { exports[`EthVault - state updates exit queue 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 144818, + "gasUsed": 144806, } `; diff --git a/test/__snapshots__/EthVault.token.spec.ts.snap b/test/__snapshots__/EthVault.token.spec.ts.snap index 76bb9479..38c0e4b7 100644 --- a/test/__snapshots__/EthVault.token.spec.ts.snap +++ b/test/__snapshots__/EthVault.token.spec.ts.snap @@ -59,7 +59,7 @@ Object { exports[`EthVault - token permit accepts owner signature 1`] = ` Object { "calldataByteLength": 228, - "gasUsed": 82511, + "gasUsed": 82523, } `; diff --git a/test/__snapshots__/EthVault.withdraw.spec.ts.snap b/test/__snapshots__/EthVault.withdraw.spec.ts.snap index 30a3c25c..85568dab 100644 --- a/test/__snapshots__/EthVault.withdraw.spec.ts.snap +++ b/test/__snapshots__/EthVault.withdraw.spec.ts.snap @@ -31,7 +31,7 @@ Object { exports[`EthVault - withdraw enter exit queue locks shares for the time of exit 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 87124, + "gasUsed": 87112, } `; @@ -40,7 +40,7 @@ exports[`EthVault - withdraw get checkpoint index works with many checkpoints 1` exports[`EthVault - withdraw redeem redeem transfers assets to receiver 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 58254, + "gasUsed": 58242, } `; diff --git a/test/__snapshots__/KeeperRewards.spec.ts.snap b/test/__snapshots__/KeeperRewards.spec.ts.snap index d2624688..02221fa2 100644 --- a/test/__snapshots__/KeeperRewards.spec.ts.snap +++ b/test/__snapshots__/KeeperRewards.spec.ts.snap @@ -2,36 +2,36 @@ exports[`KeeperRewards harvest (own escrow) succeeds for latest rewards root 1`] = ` Object { - "calldataByteLength": 324, - "gasUsed": 111585, + "calldataByteLength": 292, + "gasUsed": 110874, } `; exports[`KeeperRewards harvest (own escrow) succeeds for previous rewards root 1`] = ` Object { - "calldataByteLength": 324, - "gasUsed": 113740, + "calldataByteLength": 292, + "gasUsed": 113029, } `; exports[`KeeperRewards harvest (own escrow) succeeds for previous rewards root 2`] = ` Object { "calldataByteLength": 196, - "gasUsed": 74415, + "gasUsed": 74427, } `; exports[`KeeperRewards harvest (shared escrow) succeeds for latest rewards root 1`] = ` Object { "calldataByteLength": 292, - "gasUsed": 144199, + "gasUsed": 144187, } `; exports[`KeeperRewards harvest (shared escrow) succeeds for previous rewards root 1`] = ` Object { "calldataByteLength": 292, - "gasUsed": 146354, + "gasUsed": 146342, } `; @@ -52,20 +52,20 @@ Object { exports[`KeeperRewards update rewards succeeds 1`] = ` Object { "calldataByteLength": 772, - "gasUsed": 140899, + "gasUsed": 140923, } `; exports[`KeeperRewards update rewards succeeds 2`] = ` Object { "calldataByteLength": 772, - "gasUsed": 123811, + "gasUsed": 123739, } `; exports[`KeeperRewards update rewards succeeds with all signatures 1`] = ` Object { "calldataByteLength": 1156, - "gasUsed": 147103, + "gasUsed": 147115, } `; diff --git a/test/__snapshots__/KeeperValidators.spec.ts.snap b/test/__snapshots__/KeeperValidators.spec.ts.snap index f5d875c8..475d6b2e 100644 --- a/test/__snapshots__/KeeperValidators.spec.ts.snap +++ b/test/__snapshots__/KeeperValidators.spec.ts.snap @@ -3,32 +3,32 @@ exports[`KeeperValidators register multiple validators succeeds 1`] = ` Object { "calldataByteLength": 3716, - "gasUsed": 709015, + "gasUsed": 709045, } `; exports[`KeeperValidators register multiple validators succeeds 2`] = ` Object { "calldataByteLength": 3716, - "gasUsed": 617456, + "gasUsed": 617474, } `; exports[`KeeperValidators register single validator succeeds 1`] = ` Object { "calldataByteLength": 1508, - "gasUsed": 358189, + "gasUsed": 358167, } `; exports[`KeeperValidators register single validator succeeds 2`] = ` Object { - "calldataByteLength": 1508, - "gasUsed": 304661, + "calldataByteLength": 1540, + "gasUsed": 305547, } `; -exports[`KeeperValidators set validators rewards oracles succeeds 1`] = ` +exports[`KeeperValidators set validators oracles succeeds 1`] = ` Object { "calldataByteLength": 36, "gasUsed": 32168, diff --git a/test/__snapshots__/VaultsRegistry.spec.ts.snap b/test/__snapshots__/VaultsRegistry.spec.ts.snap index 87f41c53..b1243ca6 100644 --- a/test/__snapshots__/VaultsRegistry.spec.ts.snap +++ b/test/__snapshots__/VaultsRegistry.spec.ts.snap @@ -1,5 +1,12 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`VaultsRegistry factory can add vault 1`] = ` +Object { + "calldataByteLength": 324, + "gasUsed": 346179, +} +`; + exports[`VaultsRegistry owner can add factory 1`] = ` Object { "calldataByteLength": 36, @@ -10,14 +17,14 @@ Object { exports[`VaultsRegistry owner can add vault 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 49686, + "gasUsed": 49674, } `; exports[`VaultsRegistry owner can register implementation contract 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 47499, + "gasUsed": 47487, } `; @@ -31,6 +38,6 @@ Object { exports[`VaultsRegistry owner can remove implementation 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 25442, + "gasUsed": 25430, } `; diff --git a/test/shared/constants.ts b/test/shared/constants.ts index bf6b9c02..b3341539 100644 --- a/test/shared/constants.ts +++ b/test/shared/constants.ts @@ -1,21 +1,20 @@ -import { BigNumber } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { ethers } from 'ethers' export const PANIC_CODES = { - ARITHMETIC_UNDER_OR_OVERFLOW: 'panic code 0x11', - DIVISION_BY_ZERO: 'panic code 0x12', - OUT_OF_BOUND_INDEX: 'panic code 0x32', + ARITHMETIC_UNDER_OR_OVERFLOW: 0x11, + DIVISION_BY_ZERO: 0x12, + OUT_OF_BOUND_INDEX: 0x32, } -export const SECURITY_DEPOSIT = 1000000000 -export const MAX_UINT256 = BigNumber.from(2).pow(256).sub(1) -export const MAX_UINT16 = BigNumber.from(2).pow(16).sub(1) -export const MAX_UINT128 = BigNumber.from(2).pow(128).sub(1) +export const SECURITY_DEPOSIT = 1000000000n +export const MAX_UINT256 = 2n ** 256n - 1n +export const MAX_UINT16 = 2n ** 16n - 1n +export const MAX_UINT128 = 2n ** 128n - 1n export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' export const ZERO_BYTES32 = '0x0000000000000000000000000000000000000000000000000000000000000000' export const ONE_DAY = 86400 -export const VALIDATORS_DEADLINE = 1914150396 +export const VALIDATORS_DEADLINE = 1914150396n export const REWARDS_DELAY = ONE_DAY / 2 export const ORACLES = [ @@ -37,7 +36,7 @@ export const VALIDATORS_MIN_ORACLES = 11 export const ORACLES_CONFIG = 'QmbwQ6zFEWs1SjLPGk4NNJqn4wduVe6dK3xyte2iG59Uru' export const EXITING_ASSETS_MIN_DELAY = ONE_DAY export const OSTOKEN_FEE = 500 // 5% -export const OSTOKEN_CAPACITY = parseEther('10000000') +export const OSTOKEN_CAPACITY = ethers.parseEther('10000000') export const OSTOKEN_NAME = 'SW Staked ETH' export const OSTOKEN_SYMBOL = 'osETH' diff --git a/test/shared/expect.ts b/test/shared/expect.ts index 95215667..45f4ff14 100644 --- a/test/shared/expect.ts +++ b/test/shared/expect.ts @@ -1,11 +1,9 @@ import { expect, use } from 'chai' import { upgrades } from 'hardhat' -import { solidity } from 'ethereum-waffle' import { jestSnapshotPlugin } from 'mocha-chai-jest-snapshot' upgrades.silenceWarnings() -use(solidity) use(jestSnapshotPlugin()) export { expect } diff --git a/test/shared/fixtures.ts b/test/shared/fixtures.ts index a9624c01..0a276ec4 100644 --- a/test/shared/fixtures.ts +++ b/test/shared/fixtures.ts @@ -1,26 +1,40 @@ import { ethers, upgrades } from 'hardhat' -import { Fixture } from 'ethereum-waffle' import { BigNumberish, Contract, Wallet } from 'ethers' -import { arrayify, getContractAddress } from 'ethers/lib/utils' import { signTypedData, SignTypedDataVersion } from '@metamask/eth-sig-util' import EthereumWallet from 'ethereumjs-wallet' import { + CumulativeMerkleDrop, + CumulativeMerkleDrop__factory, EthErc20Vault, + EthErc20Vault__factory, EthPrivErc20Vault, + EthPrivErc20Vault__factory, EthPrivVault, + EthPrivVault__factory, EthVault, + EthVault__factory, EthVaultFactory, + EthVaultFactory__factory, EthVaultMock, + EthVaultMock__factory, Keeper, + Keeper__factory, OsToken, + OsToken__factory, + OsTokenChecker, + OsTokenChecker__factory, OsTokenConfig, + OsTokenConfig__factory, + PoolEscrowMock, + PoolEscrowMock__factory, PriceFeed, + PriceFeed__factory, + RewardSplitterFactory, + RewardSplitterFactory__factory, SharedMevEscrow, + SharedMevEscrow__factory, VaultsRegistry, - RewardSplitterFactory, - PoolEscrowMock, - CumulativeMerkleDrop, - OsTokenChecker, + VaultsRegistry__factory, } from '../../typechain-types' import { getValidatorsRegistryFactory } from './contracts' import { @@ -44,29 +58,80 @@ import { } from './constants' import { EthErc20VaultInitParamsStruct, EthVaultInitParamsStruct } from './types' import { extractVaultAddress } from './utils' +import { DepositorMock } from '../../typechain-types/contracts/mocks/DepositorMock' +import { DepositorMock__factory } from '../../typechain-types/factories/contracts/mocks/DepositorMock__factory' +import { UnknownVaultMock } from '../../typechain-types/contracts/mocks/UnknownVaultMock' +import { UnknownVaultMock__factory } from '../../typechain-types/factories/contracts/mocks/UnknownVaultMock__factory' +import { MulticallMock__factory } from '../../typechain-types/factories/contracts/mocks/MulticallMock__factory' +import { MulticallMock } from '../../typechain-types/contracts/mocks/MulticallMock' + +export const createDepositorMock = async function (vault: EthVault): Promise { + const depositorMockFactory = await ethers.getContractFactory('DepositorMock') + const contract = await depositorMockFactory.deploy(await vault.getAddress()) + return DepositorMock__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) +} +export const createUnknownVaultMock = async function ( + osToken: OsToken, + implementation: string +): Promise { + const factory = await ethers.getContractFactory('UnknownVaultMock') + const contract = await factory.deploy(await osToken.getAddress(), implementation) + return UnknownVaultMock__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) +} + +export const createMulticallMock = async function (): Promise { + const contract = await ethers.deployContract('MulticallMock') + return MulticallMock__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) +} export const createValidatorsRegistry = async function (): Promise { const validatorsRegistryFactory = await getValidatorsRegistryFactory() - return validatorsRegistryFactory.deploy() + const contract = await validatorsRegistryFactory.deploy() + return new Contract( + await contract.getAddress(), + validatorsRegistryFactory.interface, + await ethers.provider.getSigner() + ) } export const createPoolEscrow = async function ( stakedEthTokenAddress: string ): Promise { const factory = await ethers.getContractFactory('PoolEscrowMock') - return (await factory.deploy(stakedEthTokenAddress)) as PoolEscrowMock + const contract = await factory.deploy(stakedEthTokenAddress) + return PoolEscrowMock__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) } export const createVaultsRegistry = async function (): Promise { const factory = await ethers.getContractFactory('VaultsRegistry') - return (await factory.deploy()) as VaultsRegistry + const contract = await factory.deploy() + return VaultsRegistry__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) } export const createSharedMevEscrow = async function ( vaultsRegistry: VaultsRegistry ): Promise { const factory = await ethers.getContractFactory('SharedMevEscrow') - return (await factory.deploy(vaultsRegistry.address)) as SharedMevEscrow + const contract = await factory.deploy(await vaultsRegistry.getAddress()) + return SharedMevEscrow__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) } export const createPriceFeed = async function ( @@ -74,7 +139,8 @@ export const createPriceFeed = async function ( description: string ): Promise { const factory = await ethers.getContractFactory('PriceFeed') - return (await factory.deploy(osToken.address, description)) as PriceFeed + const contract = await factory.deploy(await osToken.getAddress(), description) + return PriceFeed__factory.connect(await contract.getAddress(), await ethers.provider.getSigner()) } export const createRewardSplitterFactory = async function (): Promise { @@ -82,7 +148,11 @@ export const createRewardSplitterFactory = async function (): Promise { const factory = await ethers.getContractFactory('OsToken') - return (await factory.deploy( + const contract = await factory.deploy( keeperAddress, - checker.address, + await checker.getAddress(), treasury.address, feePercent, capacity, name, symbol - )) as OsToken + ) + return OsToken__factory.connect(await contract.getAddress(), await ethers.provider.getSigner()) } export const createOsTokenChecker = async function ( vaultsRegistry: VaultsRegistry ): Promise { const factory = await ethers.getContractFactory('OsTokenChecker') - return (await factory.deploy(vaultsRegistry.address)) as OsTokenChecker + const contract = await factory.deploy(await vaultsRegistry.getAddress()) + return OsTokenChecker__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) } export const createOsTokenConfig = async function ( @@ -122,13 +197,17 @@ export const createOsTokenConfig = async function ( ltvPercent: BigNumberish ): Promise { const factory = await ethers.getContractFactory('OsTokenConfig') - return (await factory.deploy(owner.address, { + const contract = await factory.deploy(owner.address, { redeemFromLtvPercent, redeemToLtvPercent, liqThresholdPercent, liqBonusPercent, ltvPercent, - })) as OsTokenConfig + }) + return OsTokenConfig__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) } export const createCumulativeMerkleDrop = async function ( @@ -136,7 +215,11 @@ export const createCumulativeMerkleDrop = async function ( owner: Wallet ): Promise { const factory = await ethers.getContractFactory('CumulativeMerkleDrop') - return (await factory.deploy(owner.address, token)) as CumulativeMerkleDrop + const contract = await factory.deploy(owner.address, token) + return CumulativeMerkleDrop__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) } export const createKeeper = async function ( @@ -152,14 +235,18 @@ export const createKeeper = async function ( validatorsMinOracles: BigNumberish ): Promise { const factory = await ethers.getContractFactory('Keeper') - const keeper = (await factory.deploy( - sharedMevEscrow.address, - vaultsRegistry.address, - osToken.address, + const contract = await factory.deploy( + await sharedMevEscrow.getAddress(), + await vaultsRegistry.getAddress(), + await osToken.getAddress(), rewardsDelay, maxAvgRewardPerSecond, - validatorsRegistry.address - )) as Keeper + await validatorsRegistry.getAddress() + ) + const keeper = Keeper__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) for (let i = 0; i < initialOracles.length; i++) { await keeper.addOracle(initialOracles[i]) } @@ -175,11 +262,15 @@ export const createEthVaultFactory = async function ( vaultsRegistry: VaultsRegistry ): Promise { const factory = await ethers.getContractFactory('EthVaultFactory') - return (await factory.deploy(implementation, vaultsRegistry.address)) as EthVaultFactory + const contract = await factory.deploy(implementation, await vaultsRegistry.getAddress()) + return EthVaultFactory__factory.connect( + await contract.getAddress(), + await ethers.provider.getSigner() + ) } export const encodeEthVaultInitParams = function (vaultParams: EthVaultInitParamsStruct): string { - return ethers.utils.defaultAbiCoder.encode( + return ethers.AbiCoder.defaultAbiCoder().encode( ['tuple(uint256 capacity, uint16 feePercent, string metadataIpfsHash)'], [[vaultParams.capacity, vaultParams.feePercent, vaultParams.metadataIpfsHash]] ) @@ -188,7 +279,7 @@ export const encodeEthVaultInitParams = function (vaultParams: EthVaultInitParam export const encodeEthErc20VaultInitParams = function ( vaultParams: EthErc20VaultInitParamsStruct ): string { - return ethers.utils.defaultAbiCoder.encode( + return ethers.AbiCoder.defaultAbiCoder().encode( [ 'tuple(uint256 capacity, uint16 feePercent, string name, string symbol, string metadataIpfsHash)', ], @@ -217,7 +308,7 @@ export const getOraclesSignatures = function ( for (let i = 0; i < count; i++) { signatures.push( Buffer.from( - arrayify( + ethers.getBytes( signTypedData({ privateKey: sortedOracles[i], data: typedData, @@ -275,9 +366,8 @@ interface EthVaultFixture { ): Promise } -export const ethVaultFixture: Fixture = async function ([ - dao, -]): Promise { +export const ethVaultFixture = async function (): Promise { + const dao = await (ethers as any).provider.getSigner() const vaultsRegistry = await createVaultsRegistry() const validatorsRegistry = await createValidatorsRegistry() @@ -288,9 +378,9 @@ export const ethVaultFixture: Fixture = async function ([ // 2. calc keeper address const [_deployer] = await ethers.getSigners() - const _keeperAddress = getContractAddress({ + const _keeperAddress = ethers.getCreateAddress({ from: _deployer.address, - nonce: (await _deployer.getTransactionCount()) + 1, + nonce: (await ethers.provider.getTransactionCount(_deployer.address)) + 1, }) // 3. deploy ostoken @@ -324,7 +414,7 @@ export const ethVaultFixture: Fixture = async function ([ ) // 5. verify keeper address - if (_keeperAddress != keeper.address) { + if (_keeperAddress != (await keeper.getAddress())) { throw new Error('Invalid calculated Keeper address') } @@ -350,17 +440,17 @@ export const ethVaultFixture: Fixture = async function ([ const vaultImpl = (await upgrades.deployImplementation(vault, { unsafeAllow: ['delegatecall'], constructorArgs: [ - keeper.address, - vaultsRegistry.address, - validatorsRegistry.address, - osToken.address, - osTokenConfig.address, - sharedMevEscrow.address, + await keeper.getAddress(), + await vaultsRegistry.getAddress(), + await validatorsRegistry.getAddress(), + await osToken.getAddress(), + await osTokenConfig.getAddress(), + await sharedMevEscrow.getAddress(), EXITING_ASSETS_MIN_DELAY, ], })) as string const vaultFactory = await createEthVaultFactory(vaultImpl, vaultsRegistry) - await vaultsRegistry.addFactory(vaultFactory.address) + await vaultsRegistry.addFactory(await vaultFactory.getAddress()) await vaultsRegistry.addVaultImpl(vaultImpl) factories.push(vaultFactory) } @@ -396,10 +486,8 @@ export const ethVaultFixture: Fixture = async function ([ .createVault(encodeEthVaultInitParams(vaultParams), isOwnMevEscrow, { value: SECURITY_DEPOSIT, }) - const receipt = await tx.wait() - const vaultAddress = extractVaultAddress(receipt) - const ethVault = await ethers.getContractFactory('EthVault') - return ethVault.attach(vaultAddress) as EthVault + const vaultAddress = await extractVaultAddress(tx) + return EthVault__factory.connect(vaultAddress, await ethers.provider.getSigner()) }, createEthVaultMock: async ( admin: Wallet, @@ -411,10 +499,8 @@ export const ethVaultFixture: Fixture = async function ([ .createVault(encodeEthVaultInitParams(vaultParams), isOwnMevEscrow, { value: SECURITY_DEPOSIT, }) - const receipt = await tx.wait() - const vaultAddress = extractVaultAddress(receipt) - const ethVaultMock = await ethers.getContractFactory('EthVaultMock') - return ethVaultMock.attach(vaultAddress) as EthVaultMock + const vaultAddress = await extractVaultAddress(tx) + return EthVaultMock__factory.connect(vaultAddress, await ethers.provider.getSigner()) }, createEthPrivVault: async ( admin: Wallet, @@ -426,10 +512,8 @@ export const ethVaultFixture: Fixture = async function ([ .createVault(encodeEthVaultInitParams(vaultParams), isOwnMevEscrow, { value: SECURITY_DEPOSIT, }) - const receipt = await tx.wait() - const vaultAddress = extractVaultAddress(receipt) - const ethPrivVault = await ethers.getContractFactory('EthPrivVault') - return ethPrivVault.attach(vaultAddress) as EthPrivVault + const vaultAddress = await extractVaultAddress(tx) + return EthPrivVault__factory.connect(vaultAddress, await ethers.provider.getSigner()) }, createEthErc20Vault: async ( admin: Wallet, @@ -441,10 +525,8 @@ export const ethVaultFixture: Fixture = async function ([ .createVault(encodeEthErc20VaultInitParams(vaultParams), isOwnMevEscrow, { value: SECURITY_DEPOSIT, }) - const receipt = await tx.wait() - const vaultAddress = extractVaultAddress(receipt) - const ethErc20Vault = await ethers.getContractFactory('EthErc20Vault') - return ethErc20Vault.attach(vaultAddress) as EthErc20Vault + const vaultAddress = await extractVaultAddress(tx) + return EthErc20Vault__factory.connect(vaultAddress, await ethers.provider.getSigner()) }, createEthPrivErc20Vault: async ( admin: Wallet, @@ -456,10 +538,8 @@ export const ethVaultFixture: Fixture = async function ([ .createVault(encodeEthErc20VaultInitParams(vaultParams), isOwnMevEscrow, { value: SECURITY_DEPOSIT, }) - const receipt = await tx.wait() - const vaultAddress = extractVaultAddress(receipt) - const ethPrivErc20Vault = await ethers.getContractFactory('EthPrivErc20Vault') - return ethPrivErc20Vault.attach(vaultAddress) as EthPrivErc20Vault + const vaultAddress = await extractVaultAddress(tx) + return EthPrivErc20Vault__factory.connect(vaultAddress, await ethers.provider.getSigner()) }, } } diff --git a/test/shared/rewards.ts b/test/shared/rewards.ts index 9f4ef988..d61b4318 100644 --- a/test/shared/rewards.ts +++ b/test/shared/rewards.ts @@ -1,6 +1,5 @@ -import { network, waffle } from 'hardhat' -import { BigNumberish, Contract, ethers, Signer, Wallet } from 'ethers' -import { parseEther } from 'ethers/lib/utils' +import { ethers, network } from 'hardhat' +import { Contract, Signer, Wallet } from 'ethers' import { StandardMerkleTree } from '@openzeppelin/merkle-tree' import { EthVault, IKeeperRewards, Keeper } from '../../typechain-types' import { @@ -17,32 +16,32 @@ import { registerEthValidator } from './validators' import { extractExitPositionTicket, getBlockTimestamp, increaseTime, setBalance } from './utils' import { getOraclesSignatures } from './fixtures' -export type RewardsTree = StandardMerkleTree<[string, BigNumberish, BigNumberish]> +export type RewardsTree = StandardMerkleTree<[string, bigint, bigint]> export type RewardsUpdate = { root: string ipfsHash: string - updateTimestamp: BigNumberish - avgRewardPerSecond: BigNumberish + updateTimestamp: number + avgRewardPerSecond: number tree: RewardsTree signingData: any } export type VaultReward = { vault: string - reward: BigNumberish - unlockedMevReward: BigNumberish + reward: bigint + unlockedMevReward: bigint } function randomIntFromInterval(min, max): number { return Math.floor(Math.random() * (max - min + 1) + min) } -export function getKeeperRewardsUpdateData( +export async function getKeeperRewardsUpdateData( rewards: VaultReward[], keeper: Keeper, - { nonce = 1, updateTimestamp = '1670255895', avgRewardPerSecond = 1585489600 } = {} -): RewardsUpdate { + { nonce = 1, updateTimestamp = 1670255895, avgRewardPerSecond = 1585489600 } = {} +): Promise { const tree = StandardMerkleTree.of( rewards.map((r) => [r.vault, r.reward, r.unlockedMevReward]), ['address', 'int160', 'uint160'] @@ -65,7 +64,7 @@ export function getKeeperRewardsUpdateData( name: 'KeeperOracles', version: '1', chainId: network.config.chainId, - verifyingContract: keeper.address, + verifyingContract: await keeper.getAddress(), }, message: { rewardsRoot: treeRoot, @@ -84,13 +83,13 @@ export async function updateRewards( avgRewardPerSecond: number = randomIntFromInterval(1, MAX_AVG_REWARD_PER_SECOND) ): Promise { const rewardsNonce = await keeper.rewardsNonce() - const rewardsUpdate = getKeeperRewardsUpdateData(rewards, keeper, { - nonce: rewardsNonce.toNumber(), + const rewardsUpdate = await getKeeperRewardsUpdateData(rewards, keeper, { + nonce: Number(rewardsNonce), avgRewardPerSecond, }) await increaseTime(REWARDS_DELAY) - const oracle = new ethers.Wallet(ORACLES[0], waffle.provider) - await setBalance(oracle.address, parseEther('2000')) + const oracle = new ethers.Wallet(ORACLES[0].toString('hex'), ethers.provider) + await setBalance(oracle.address, ethers.parseEther('2000')) await keeper.connect(oracle).updateRewards({ rewardsRoot: rewardsUpdate.root, @@ -112,39 +111,44 @@ export async function collateralizeEthVault( validatorsRegistry: Contract, admin: Wallet ) { - const balanceBefore = await waffle.provider.getBalance(vault.address) + const vaultAddress = await vault.getAddress() + const balanceBefore = await ethers.provider.getBalance(vaultAddress) // register validator - const validatorDeposit = parseEther('32') + const validatorDeposit = ethers.parseEther('32') await vault.connect(admin).deposit(admin.address, ZERO_ADDRESS, { value: validatorDeposit }) await registerEthValidator(vault, keeper, validatorsRegistry, admin) // update rewards tree const rewardsTree = await updateRewards(keeper, [ - { vault: vault.address, reward: 0, unlockedMevReward: 0 }, + { vault: vaultAddress, reward: 0n, unlockedMevReward: 0n }, ]) const proof = getRewardsRootProof(rewardsTree, { - vault: vault.address, - reward: 0, - unlockedMevReward: 0, + vault: vaultAddress, + reward: 0n, + unlockedMevReward: 0n, }) // exit validator const response = await vault.connect(admin).enterExitQueue(validatorDeposit, admin.address) - const receipt = await response.wait() - const positionTicket = extractExitPositionTicket(receipt) - const timestamp = await getBlockTimestamp(receipt) + const positionTicket = await extractExitPositionTicket(response) + const timestamp = await getBlockTimestamp(response) await increaseTime(EXITING_ASSETS_MIN_DELAY) - await setBalance(vault.address, validatorDeposit) + await setBalance(vaultAddress, validatorDeposit) - await vault.updateState({ rewardsRoot: rewardsTree.root, reward: 0, unlockedMevReward: 0, proof }) + await vault.updateState({ + rewardsRoot: rewardsTree.root, + reward: 0n, + unlockedMevReward: 0n, + proof, + }) // claim exited assets const exitQueueIndex = await vault.getExitQueueIndex(positionTicket) await vault.connect(admin).claimExitedAssets(positionTicket, timestamp, exitQueueIndex) await increaseTime(ONE_DAY) - await setBalance(vault.address, balanceBefore) + await setBalance(vaultAddress, balanceBefore) } export async function setAvgRewardPerSecond( @@ -153,19 +157,20 @@ export async function setAvgRewardPerSecond( keeper: Keeper, avgRewardPerSecond: number ) { + const vaultAddress = await vault.getAddress() const tree = await updateRewards( keeper, - [{ vault: vault.address, reward: 0, unlockedMevReward: 0 }], + [{ vault: vaultAddress, reward: 0n, unlockedMevReward: 0n }], avgRewardPerSecond ) const harvestParams: IKeeperRewards.HarvestParamsStruct = { rewardsRoot: tree.root, - reward: 0, - unlockedMevReward: 0, + reward: 0n, + unlockedMevReward: 0n, proof: getRewardsRootProof(tree, { - vault: vault.address, - unlockedMevReward: 0, - reward: 0, + vault: vaultAddress, + unlockedMevReward: 0n, + reward: 0n, }), } await vault.connect(dao).updateState(harvestParams) diff --git a/test/shared/snapshotGasCost.ts b/test/shared/snapshotGasCost.ts index c94e62c1..882d7b9f 100644 --- a/test/shared/snapshotGasCost.ts +++ b/test/shared/snapshotGasCost.ts @@ -1,6 +1,7 @@ import { TransactionReceipt, TransactionResponse } from '@ethersproject/abstract-provider' import { BigNumber } from '@ethersproject/bignumber' import { ContractTransaction } from '@ethersproject/contracts' +import { ContractTransactionResponse } from 'ethers' import { expect } from './expect' const COVERAGE = process.env.COVERAGE === 'true' @@ -9,6 +10,8 @@ const COVERAGE = process.env.COVERAGE === 'true' export default async function snapshotGasCost( x: | TransactionResponse + | ContractTransactionResponse + | Promise | Promise | TransactionResponse[] | Promise[] @@ -19,6 +22,7 @@ export default async function snapshotGasCost( | BigNumber | Promise | number + | bigint ): Promise { if (COVERAGE) return Promise.resolve() @@ -27,18 +31,20 @@ export default async function snapshotGasCost( const unpromisedDeep = await Promise.all(unpromised.map(async (p) => await p)) const waited = await Promise.all(unpromisedDeep.map(async (p) => p.wait())) expect({ - gasUsed: waited.reduce((m, v) => m + v.gasUsed.toNumber(), 0), + gasUsed: waited.reduce((m, v) => m + Number(v.gasUsed), 0), calldataByteLength: unpromisedDeep.reduce((m, v) => m + v.data.length / 2 - 1, 0), }).toMatchSnapshot() } else if (typeof unpromised === 'number') { expect(unpromised).toMatchSnapshot() + } else if (typeof unpromised === 'bigint') { + expect(Number(unpromised)).toMatchSnapshot() } else if ('wait' in unpromised) { - const waited = await unpromised.wait() + const waited = (await unpromised.wait()) as TransactionReceipt expect({ - gasUsed: waited.gasUsed.toNumber(), + gasUsed: Number(waited.gasUsed), calldataByteLength: unpromised.data.length / 2 - 1, }).toMatchSnapshot() } else if (BigNumber.isBigNumber(unpromised)) { - expect(unpromised.toNumber()).toMatchSnapshot() + expect(Number(unpromised)).toMatchSnapshot() } } diff --git a/test/shared/types.ts b/test/shared/types.ts index 1a4fec57..1c3633ab 100644 --- a/test/shared/types.ts +++ b/test/shared/types.ts @@ -1,14 +1,12 @@ -import { BigNumberish } from 'ethers' - export type EthVaultInitParamsStruct = { - capacity: BigNumberish - feePercent: BigNumberish + capacity: bigint + feePercent: number metadataIpfsHash: string } export type EthErc20VaultInitParamsStruct = { - capacity: BigNumberish - feePercent: BigNumberish + capacity: bigint + feePercent: number name: string symbol: string metadataIpfsHash: string diff --git a/test/shared/utils.ts b/test/shared/utils.ts index 32b03a44..3b871cd4 100644 --- a/test/shared/utils.ts +++ b/test/shared/utils.ts @@ -1,7 +1,7 @@ import { ECDSASignature, fromRpcSig } from 'ethereumjs-util' import { signTypedData, SignTypedDataVersion, TypedDataUtils } from '@metamask/eth-sig-util' -import { ethers, waffle } from 'hardhat' -import { BigNumber, ContractReceipt } from 'ethers' +import { ethers } from 'hardhat' +import { ContractTransactionReceipt, ContractTransactionResponse } from 'ethers' import { EIP712Domain } from './constants' export const getSignatureFromTypedData = (privateKey: Buffer, data: any): ECDSASignature => { @@ -9,24 +9,49 @@ export const getSignatureFromTypedData = (privateKey: Buffer, data: any): ECDSAS return fromRpcSig(signature) } -export const extractVaultAddress = (receipt: ContractReceipt): string => { - return receipt.events?.[receipt.events.length - 1].args?.vault as string +export const extractVaultAddress = async ( + response: ContractTransactionResponse +): Promise => { + const receipt = (await response.wait()) as ContractTransactionReceipt + const log = receipt.logs?.[receipt.logs.length - 1] + if (!('args' in log)) { + throw new Error('No logs found') + } + return log.args?.vault as string } -export const extractMevEscrowAddress = (receipt: ContractReceipt): string => { - return receipt.events?.[receipt.events.length - 1].args?.ownMevEscrow as string +export const extractMevEscrowAddress = async ( + response: ContractTransactionResponse +): Promise => { + const receipt = (await response.wait()) as ContractTransactionReceipt + const log = receipt.logs?.[receipt.logs.length - 1] + if (!('args' in log)) { + throw new Error('No logs found') + } + return log.args?.ownMevEscrow as string } -export const getBlockTimestamp = async (receipt: ContractReceipt): Promise => { - return (await waffle.provider.getBlock(receipt.blockNumber)).timestamp +export const getBlockTimestamp = async (response: ContractTransactionResponse): Promise => { + const receipt = (await response.wait()) as ContractTransactionReceipt + const block = await ethers.provider.getBlock(receipt.blockNumber) + return block?.timestamp as number } -export const extractExitPositionTicket = (receipt: ContractReceipt): BigNumber => { - let positionTicket = receipt.events?.[receipt.events.length - 1].args?.positionTicket - if (!positionTicket && receipt.events?.length && receipt.events?.length > 1) { - positionTicket = receipt.events?.[receipt.events.length - 2].args?.positionTicket +export const extractExitPositionTicket = async ( + response: ContractTransactionResponse +): Promise => { + const receipt = (await response.wait()) as ContractTransactionReceipt + let log = receipt.logs?.[receipt.logs.length - 1] + if (!('args' in log)) { + throw new Error('No logs found') + } + if (log.args?.positionTicket == undefined && receipt.logs?.length && receipt.logs?.length > 1) { + log = receipt.logs?.[receipt.logs.length - 2] + if (!('args' in log)) { + throw new Error('No logs found') + } } - return positionTicket as BigNumber + return log.args?.positionTicket as bigint } export async function domainSeparator(name, version, chainId, verifyingContract) { @@ -46,19 +71,23 @@ export async function domainSeparator(name, version, chainId, verifyingContract) ) } -export async function latestTimestamp(): Promise { +export async function getLatestBlockTimestamp(): Promise { const block = await ethers.provider.getBlock('latest') - return BigNumber.from(block.timestamp) + if (!block) { + throw new Error('No block found') + } + return block.timestamp } -export async function setBalance(address: string, value: BigNumber): Promise { - return waffle.provider.send('hardhat_setBalance', [ - address, - value.toHexString().replace('0x0', '0x'), - ]) +export async function setBalance(address: string, value: bigint): Promise { + return ethers.provider.send('hardhat_setBalance', [address, '0x' + value.toString(16)]) } export async function increaseTime(seconds: number): Promise { - await waffle.provider.send('evm_increaseTime', [seconds]) - return waffle.provider.send('evm_mine', []) + await ethers.provider.send('evm_increaseTime', [seconds]) + return ethers.provider.send('evm_mine', []) +} + +export function toHexString(data: Buffer | Uint8Array): string { + return '0x' + data.toString('hex') } diff --git a/test/shared/validators.ts b/test/shared/validators.ts index 03114904..b0538a92 100644 --- a/test/shared/validators.ts +++ b/test/shared/validators.ts @@ -1,9 +1,8 @@ import { ByteVectorType, ContainerType, Type, UintNumberType } from '@chainsafe/ssz' import { StandardMerkleTree } from '@openzeppelin/merkle-tree' -import { network } from 'hardhat' +import { ethers, network } from 'hardhat' import { Buffer } from 'buffer' -import { BigNumber, BigNumberish, BytesLike, Contract, ContractTransaction, Wallet } from 'ethers' -import { arrayify, parseEther } from 'ethers/lib/utils' +import { BytesLike, Contract, ContractTransactionResponse, Wallet } from 'ethers' import bls from 'bls-eth-wasm' import { EthVault, Keeper } from '../../typechain-types' import { @@ -43,7 +42,7 @@ export const exitSignatureIpfsHashes = [ const DOMAIN_DEPOSIT = Uint8Array.from([3, 0, 0, 0]) const ETH1_ADDRESS_WITHDRAWAL_PREFIX = Uint8Array.from([1]) -const GENESIS_FORK_VERSION = arrayify('0x00000000') +const GENESIS_FORK_VERSION = ethers.getBytes('0x00000000') const ZERO_HASH = Buffer.alloc(32, 0) // SSZ types @@ -135,11 +134,15 @@ function computeSigningRoot(type: Type, sszObject: T, domain): Uint8Array } export function getWithdrawalCredentials(vaultAddress: string): Buffer { - return Buffer.concat([ETH1_ADDRESS_WITHDRAWAL_PREFIX, Buffer.alloc(11), arrayify(vaultAddress)]) + return Buffer.concat([ + ETH1_ADDRESS_WITHDRAWAL_PREFIX, + Buffer.alloc(11), + ethers.getBytes(vaultAddress), + ]) } export async function createValidators( - depositAmount: BigNumber, + depositAmount: bigint, vaultAddress: string ): Promise { await bls.init(bls.BLS12_381) @@ -148,14 +151,14 @@ export async function createValidators( const validators: Buffer[] = [] for (let i = 0; i < secretKeys.length; i++) { const secretKey = new bls.SecretKey() - secretKey.deserialize(arrayify(secretKeys[i])) + secretKey.deserialize(ethers.getBytes(secretKeys[i])) const publicKey = secretKey.getPublicKey().serialize() // create DepositData const depositData = { pubkey: publicKey, withdrawalCredentials, - amount: depositAmount.div(1000000000).toNumber(), // convert to gwei + amount: Number(depositAmount / 1000000000n), // convert to gwei signature: Buffer.alloc(0), } const domain = computeDomain(DOMAIN_DEPOSIT, GENESIS_FORK_VERSION, ZERO_HASH) @@ -169,7 +172,7 @@ export async function createValidators( export function appendDepositData( validator: Buffer, - depositAmount: BigNumber, + depositAmount: bigint, vaultAddress: string ): Buffer { const withdrawalCredentials = getWithdrawalCredentials(vaultAddress) @@ -178,15 +181,15 @@ export function appendDepositData( const depositData = { pubkey: validator.subarray(0, 48), withdrawalCredentials, - amount: depositAmount.div(1000000000).toNumber(), // convert to gwei + amount: Number(depositAmount / 1000000000n), // convert to gwei signature: validator.subarray(48, 144), } return Buffer.concat([validator, DepositData.hashTreeRoot(depositData)]) } export async function createEthValidatorsData(vault: EthVault): Promise { - const validatorDeposit = parseEther('32') - const validators = await createValidators(validatorDeposit, vault.address) + const validatorDeposit = ethers.parseEther('32') + const validators = await createValidators(validatorDeposit, await vault.getAddress()) const tree = StandardMerkleTree.of( validators.map((v, i) => [v, i]), ['bytes', 'uint256'] @@ -200,9 +203,9 @@ export async function createEthValidatorsData(vault: EthVault): Promise { +): Promise { const validatorsData = await createEthValidatorsData(vault) const validatorsRegistryRoot = await validatorsRegistry.get_deposit_root() await vault.connect(admin).setValidatorsRoot(validatorsData.root) const validator = validatorsData.validators[0] const exitSignatureIpfsHash = exitSignatureIpfsHashes[0] - const signingData = getEthValidatorsSigningData( + const signingData = await getEthValidatorsSigningData( validator, VALIDATORS_DEADLINE, exitSignatureIpfsHash, diff --git a/tsconfig.json b/tsconfig.json index 27b025bd..a148f2d8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2019", + "target": "es2020", "module": "commonjs", "strict": true, "esModuleInterop": true, From 062c86216b1b21259d1405673068adf448ecc5b7 Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Tue, 10 Oct 2023 17:54:42 +0300 Subject: [PATCH 11/12] Migrate to openzeppelin v5 --- abi/IERC1155Errors.json | 104 +++++++++++++++++ abi/IERC1822ProxiableUpgradeable.json | 15 --- abi/IERC1967.json | 47 -------- abi/IERC1967Upgradeable.json | 47 -------- abi/IERC20Errors.json | 88 +++++++++++++++ abi/IERC721Errors.json | 105 ++++++++++++++++++ contracts/interfaces/IVaultVersion.sol | 4 +- contracts/keeper/KeeperOracles.sol | 4 +- contracts/misc/CumulativeMerkleDrop.sol | 4 +- contracts/misc/RewardSplitter.sol | 2 +- contracts/osToken/OsToken.sol | 12 +- contracts/osToken/OsTokenConfig.sol | 4 +- contracts/vaults/VaultsRegistry.sol | 4 +- contracts/vaults/modules/VaultEnterExit.sol | 2 +- contracts/vaults/modules/VaultEthStaking.sol | 2 +- contracts/vaults/modules/VaultState.sol | 2 +- contracts/vaults/modules/VaultVersion.sol | 14 +-- package-lock.json | 19 ++-- package.json | 4 +- test/CumulativeMerkleDrop.spec.ts | 2 +- test/EthGenesisVault.spec.ts | 5 +- test/EthVault.register.spec.ts | 2 +- test/EthVault.state.spec.ts | 2 +- test/EthVault.upgrade.spec.ts | 15 +-- test/EthVaultFactory.spec.ts | 5 +- test/KeeperOracles.spec.ts | 15 ++- test/KeeperRewards.spec.ts | 5 +- test/KeeperValidators.spec.ts | 5 +- test/OsToken.spec.ts | 28 ++--- test/OsTokenConfig.spec.ts | 5 +- test/RewardSplitter.spec.ts | 4 +- test/VaultsRegistry.spec.ts | 15 +-- .../CumulativeMerkleDrop.spec.ts.snap | 2 +- test/__snapshots__/EthErc20Vault.spec.ts.snap | 10 +- .../EthGenesisVault.spec.ts.snap | 16 +-- .../EthPrivErc20Vault.spec.ts.snap | 4 +- test/__snapshots__/EthVault.burn.spec.ts.snap | 4 +- .../EthVault.deposit.spec.ts.snap | 8 +- .../EthVault.liquidate.spec.ts.snap | 4 +- test/__snapshots__/EthVault.mint.spec.ts.snap | 6 +- .../EthVault.multicall.spec.ts.snap | 4 +- .../EthVault.redeem.spec.ts.snap | 4 +- .../EthVault.register.spec.ts.snap | 4 +- .../EthVault.settings.spec.ts.snap | 8 +- .../__snapshots__/EthVault.state.spec.ts.snap | 6 +- .../__snapshots__/EthVault.token.spec.ts.snap | 26 ++--- .../EthVault.upgrade.spec.ts.snap | 2 +- .../EthVault.whitelist.spec.ts.snap | 10 +- .../EthVault.withdraw.spec.ts.snap | 16 +-- .../EthVaultFactory.spec.ts.snap | 16 +-- test/__snapshots__/KeeperRewards.spec.ts.snap | 18 +-- .../KeeperValidators.spec.ts.snap | 8 +- test/__snapshots__/OsToken.spec.ts.snap | 2 +- test/__snapshots__/OsTokenConfig.spec.ts.snap | 2 +- .../__snapshots__/RewardSplitter.spec.ts.snap | 10 +- .../RewardSplitterFactory.spec.ts.snap | 2 +- .../__snapshots__/VaultsRegistry.spec.ts.snap | 2 +- 57 files changed, 487 insertions(+), 298 deletions(-) create mode 100644 abi/IERC1155Errors.json delete mode 100644 abi/IERC1822ProxiableUpgradeable.json delete mode 100644 abi/IERC1967.json delete mode 100644 abi/IERC1967Upgradeable.json create mode 100644 abi/IERC20Errors.json create mode 100644 abi/IERC721Errors.json diff --git a/abi/IERC1155Errors.json b/abi/IERC1155Errors.json new file mode 100644 index 00000000..f2d2b1dc --- /dev/null +++ b/abi/IERC1155Errors.json @@ -0,0 +1,104 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ERC1155InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC1155InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "idsLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "valuesLength", + "type": "uint256" + } + ], + "name": "ERC1155InvalidArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "ERC1155InvalidOperator", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC1155InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC1155InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "ERC1155MissingApprovalForAll", + "type": "error" + } +] diff --git a/abi/IERC1822ProxiableUpgradeable.json b/abi/IERC1822ProxiableUpgradeable.json deleted file mode 100644 index b1a67dc5..00000000 --- a/abi/IERC1822ProxiableUpgradeable.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "inputs": [], - "name": "proxiableUUID", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/abi/IERC1967.json b/abi/IERC1967.json deleted file mode 100644 index 0855e48e..00000000 --- a/abi/IERC1967.json +++ /dev/null @@ -1,47 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" - } - ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - } -] diff --git a/abi/IERC1967Upgradeable.json b/abi/IERC1967Upgradeable.json deleted file mode 100644 index 0855e48e..00000000 --- a/abi/IERC1967Upgradeable.json +++ /dev/null @@ -1,47 +0,0 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "previousAdmin", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "AdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "beacon", - "type": "address" - } - ], - "name": "BeaconUpgraded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "implementation", - "type": "address" - } - ], - "name": "Upgraded", - "type": "event" - } -] diff --git a/abi/IERC20Errors.json b/abi/IERC20Errors.json new file mode 100644 index 00000000..d2e35dd4 --- /dev/null +++ b/abi/IERC20Errors.json @@ -0,0 +1,88 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "needed", + "type": "uint256" + } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "ERC20InvalidSpender", + "type": "error" + } +] diff --git a/abi/IERC721Errors.json b/abi/IERC721Errors.json new file mode 100644 index 00000000..719d8f9c --- /dev/null +++ b/abi/IERC721Errors.json @@ -0,0 +1,105 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "ERC721IncorrectOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ERC721InsufficientApproval", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "approver", + "type": "address" + } + ], + "name": "ERC721InvalidApprover", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "ERC721InvalidOperator", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "ERC721InvalidOwner", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "ERC721InvalidReceiver", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "ERC721InvalidSender", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ERC721NonexistentToken", + "type": "error" + } +] diff --git a/contracts/interfaces/IVaultVersion.sol b/contracts/interfaces/IVaultVersion.sol index 7ab47e3d..46f68f0d 100644 --- a/contracts/interfaces/IVaultVersion.sol +++ b/contracts/interfaces/IVaultVersion.sol @@ -2,7 +2,7 @@ pragma solidity =0.8.20; -import {IERC1822ProxiableUpgradeable} from '@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol'; +import {IERC1822Proxiable} from '@openzeppelin/contracts/interfaces/draft-IERC1822.sol'; import {IVaultAdmin} from './IVaultAdmin.sol'; /** @@ -10,7 +10,7 @@ import {IVaultAdmin} from './IVaultAdmin.sol'; * @author StakeWise * @notice Defines the interface for VaultVersion contract */ -interface IVaultVersion is IERC1822ProxiableUpgradeable, IVaultAdmin { +interface IVaultVersion is IERC1822Proxiable, IVaultAdmin { /** * @notice Vault Unique Identifier * @return The unique identifier of the Vault diff --git a/contracts/keeper/KeeperOracles.sol b/contracts/keeper/KeeperOracles.sol index a7f4c866..0ae082b5 100644 --- a/contracts/keeper/KeeperOracles.sol +++ b/contracts/keeper/KeeperOracles.sol @@ -2,7 +2,7 @@ pragma solidity =0.8.20; -import {Ownable2Step} from '@openzeppelin/contracts/access/Ownable2Step.sol'; +import {Ownable2Step, Ownable} from '@openzeppelin/contracts/access/Ownable2Step.sol'; import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; import {ECDSA} from '@openzeppelin/contracts/utils/cryptography/ECDSA.sol'; import {Errors} from '../libraries/Errors.sol'; @@ -26,7 +26,7 @@ abstract contract KeeperOracles is Ownable2Step, EIP712, IKeeperOracles { /** * @dev Constructor */ - constructor() Ownable2Step() EIP712('KeeperOracles', '1') {} + constructor() Ownable(msg.sender) EIP712('KeeperOracles', '1') {} /// @inheritdoc IKeeperOracles function addOracle(address oracle) external override onlyOwner { diff --git a/contracts/misc/CumulativeMerkleDrop.sol b/contracts/misc/CumulativeMerkleDrop.sol index a905ddeb..098c3213 100644 --- a/contracts/misc/CumulativeMerkleDrop.sol +++ b/contracts/misc/CumulativeMerkleDrop.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.20; import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; -import {Ownable2Step} from '@openzeppelin/contracts/access/Ownable2Step.sol'; +import {Ownable2Step, Ownable} from '@openzeppelin/contracts/access/Ownable2Step.sol'; import {SafeERC20} from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import {MerkleProof} from '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol'; import {ICumulativeMerkleDrop} from '../interfaces/ICumulativeMerkleDrop.sol'; @@ -22,7 +22,7 @@ contract CumulativeMerkleDrop is Ownable2Step, ICumulativeMerkleDrop { * @param _owner The address of the owner of the contract * @param _token The address of the token contract */ - constructor(address _owner, address _token) { + constructor(address _owner, address _token) Ownable(msg.sender) { _transferOwnership(_owner); token = IERC20(_token); } diff --git a/contracts/misc/RewardSplitter.sol b/contracts/misc/RewardSplitter.sol index 4030cdfc..bd2cfde9 100644 --- a/contracts/misc/RewardSplitter.sol +++ b/contracts/misc/RewardSplitter.sol @@ -41,7 +41,7 @@ contract RewardSplitter is IRewardSplitter, Initializable, OwnableUpgradeable, M /// @inheritdoc IRewardSplitter function initialize(address owner, address _vault) external override initializer { - _transferOwnership(owner); + __Ownable_init(owner); vault = _vault; } diff --git a/contracts/osToken/OsToken.sol b/contracts/osToken/OsToken.sol index d3395d4f..7e71949e 100644 --- a/contracts/osToken/OsToken.sol +++ b/contracts/osToken/OsToken.sol @@ -2,7 +2,7 @@ pragma solidity =0.8.20; -import {Ownable2Step} from '@openzeppelin/contracts/access/Ownable2Step.sol'; +import {Ownable2Step, Ownable} from '@openzeppelin/contracts/access/Ownable2Step.sol'; import {SafeCast} from '@openzeppelin/contracts/utils/math/SafeCast.sol'; import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; import {Errors} from '../libraries/Errors.sol'; @@ -64,7 +64,7 @@ contract OsToken is ERC20, Ownable2Step, IOsToken { uint256 _capacity, string memory _name, string memory _symbol - ) ERC20(_name, _symbol) Ownable2Step() { + ) ERC20(_name, _symbol) Ownable(msg.sender) { keeper = _keeper; checker = _checker; _lastUpdateTimestamp = uint64(block.timestamp); @@ -90,12 +90,12 @@ contract OsToken is ERC20, Ownable2Step, IOsToken { /// @inheritdoc IOsToken function convertToShares(uint256 assets) public view override returns (uint256 shares) { - return _convertToShares(assets, _totalShares, totalAssets(), Math.Rounding.Down); + return _convertToShares(assets, _totalShares, totalAssets(), Math.Rounding.Floor); } /// @inheritdoc IOsToken function convertToAssets(uint256 shares) public view override returns (uint256 assets) { - return _convertToAssets(shares, _totalShares, totalAssets(), Math.Rounding.Down); + return _convertToAssets(shares, _totalShares, totalAssets(), Math.Rounding.Floor); } /// @inheritdoc IOsToken @@ -229,7 +229,7 @@ contract OsToken is ERC20, Ownable2Step, IOsToken { totalShares, // cannot underflow because profitAccrued >= treasuryAssets _totalAssets + profitAccrued - treasuryAssets, - Math.Rounding.Down + Math.Rounding.Floor ); } @@ -270,7 +270,7 @@ contract OsToken is ERC20, Ownable2Step, IOsToken { totalShares, // cannot underflow because newTotalAssets >= treasuryAssets newTotalAssets - treasuryAssets, - Math.Rounding.Down + Math.Rounding.Floor ); } diff --git a/contracts/osToken/OsTokenConfig.sol b/contracts/osToken/OsTokenConfig.sol index 2ea4393f..3f9cb50e 100644 --- a/contracts/osToken/OsTokenConfig.sol +++ b/contracts/osToken/OsTokenConfig.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.20; import {Math} from '@openzeppelin/contracts/utils/math/Math.sol'; -import {Ownable2Step} from '@openzeppelin/contracts/access/Ownable2Step.sol'; +import {Ownable2Step, Ownable} from '@openzeppelin/contracts/access/Ownable2Step.sol'; import {IOsTokenConfig} from '../interfaces/IOsTokenConfig.sol'; import {Errors} from '../libraries/Errors.sol'; @@ -22,7 +22,7 @@ contract OsTokenConfig is Ownable2Step, IOsTokenConfig { * @param _owner The address of the contract owner * @param config The OsToken configuration */ - constructor(address _owner, Config memory config) Ownable2Step() { + constructor(address _owner, Config memory config) Ownable(msg.sender) { updateConfig(config); _transferOwnership(_owner); } diff --git a/contracts/vaults/VaultsRegistry.sol b/contracts/vaults/VaultsRegistry.sol index e0597516..0d76fb9c 100644 --- a/contracts/vaults/VaultsRegistry.sol +++ b/contracts/vaults/VaultsRegistry.sol @@ -2,7 +2,7 @@ pragma solidity =0.8.20; -import {Ownable2Step} from '@openzeppelin/contracts/access/Ownable2Step.sol'; +import {Ownable2Step, Ownable} from '@openzeppelin/contracts/access/Ownable2Step.sol'; import {IVaultsRegistry} from '../interfaces/IVaultsRegistry.sol'; import {Errors} from '../libraries/Errors.sol'; @@ -24,7 +24,7 @@ contract VaultsRegistry is Ownable2Step, IVaultsRegistry { /** * @dev Constructor */ - constructor() Ownable2Step() {} + constructor() Ownable(msg.sender) {} /// @inheritdoc IVaultsRegistry function addVault(address vault) external override { diff --git a/contracts/vaults/modules/VaultEnterExit.sol b/contracts/vaults/modules/VaultEnterExit.sol index 60a1a28b..4dba2c3c 100644 --- a/contracts/vaults/modules/VaultEnterExit.sol +++ b/contracts/vaults/modules/VaultEnterExit.sol @@ -185,7 +185,7 @@ abstract contract VaultEnterExit is VaultImmutables, Initializable, VaultState, if (totalAssetsAfter > capacity()) revert Errors.CapacityExceeded(); // calculate amount of shares to mint - shares = _convertToShares(assets, Math.Rounding.Up); + shares = _convertToShares(assets, Math.Rounding.Ceil); // update state _totalAssets = SafeCast.toUint128(totalAssetsAfter); diff --git a/contracts/vaults/modules/VaultEthStaking.sol b/contracts/vaults/modules/VaultEthStaking.sol index 583d4029..df41e795 100644 --- a/contracts/vaults/modules/VaultEthStaking.sol +++ b/contracts/vaults/modules/VaultEthStaking.sol @@ -3,7 +3,7 @@ pragma solidity =0.8.20; import {Initializable} from '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol'; -import {ReentrancyGuardUpgradeable} from '@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol'; +import {ReentrancyGuardUpgradeable} from '@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol'; import {Address} from '@openzeppelin/contracts/utils/Address.sol'; import {IEthValidatorsRegistry} from '../../interfaces/IEthValidatorsRegistry.sol'; import {IKeeperRewards} from '../../interfaces/IKeeperRewards.sol'; diff --git a/contracts/vaults/modules/VaultState.sol b/contracts/vaults/modules/VaultState.sol index dbb83e99..f0b41554 100644 --- a/contracts/vaults/modules/VaultState.sol +++ b/contracts/vaults/modules/VaultState.sol @@ -50,7 +50,7 @@ abstract contract VaultState is VaultImmutables, Initializable, VaultFee, IVault /// @inheritdoc IVaultState function convertToShares(uint256 assets) public view override returns (uint256 shares) { - return _convertToShares(assets, Math.Rounding.Down); + return _convertToShares(assets, Math.Rounding.Floor); } /// @inheritdoc IVaultState diff --git a/contracts/vaults/modules/VaultVersion.sol b/contracts/vaults/modules/VaultVersion.sol index 94c23d79..30b6744e 100644 --- a/contracts/vaults/modules/VaultVersion.sol +++ b/contracts/vaults/modules/VaultVersion.sol @@ -4,6 +4,7 @@ pragma solidity =0.8.20; import {UUPSUpgradeable} from '@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol'; import {Initializable} from '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol'; +import {ERC1967Utils} from '@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol'; import {IVaultsRegistry} from '../../interfaces/IVaultsRegistry.sol'; import {IVaultVersion} from '../../interfaces/IVaultVersion.sol'; import {Errors} from '../../libraries/Errors.sol'; @@ -26,13 +27,7 @@ abstract contract VaultVersion is /// @inheritdoc IVaultVersion function implementation() external view override returns (address) { - return _getImplementation(); - } - - /// @inheritdoc UUPSUpgradeable - function upgradeTo(address) public view override onlyProxy { - // disable upgrades without the call - revert Errors.UpgradeFailed(); + return ERC1967Utils.getImplementation(); } /// @inheritdoc UUPSUpgradeable @@ -40,8 +35,7 @@ abstract contract VaultVersion is address newImplementation, bytes memory data ) public payable override onlyProxy { - _authorizeUpgrade(newImplementation); - _upgradeToAndCallUUPS(newImplementation, abi.encodeWithSelector(_initSelector, data), true); + super.upgradeToAndCall(newImplementation, abi.encodeWithSelector(_initSelector, data)); } /// @inheritdoc UUPSUpgradeable @@ -49,7 +43,7 @@ abstract contract VaultVersion is _checkAdmin(); if ( newImplementation == address(0) || - _getImplementation() == newImplementation || // cannot reinit the same implementation + ERC1967Utils.getImplementation() == newImplementation || // cannot reinit the same implementation IVaultVersion(newImplementation).vaultId() != vaultId() || // vault must be of the same type IVaultVersion(newImplementation).version() != version() + 1 || // vault cannot skip versions between !IVaultsRegistry(_vaultsRegistry).vaultImpls(newImplementation) // new implementation must be registered diff --git a/package-lock.json b/package-lock.json index 09eab958..61902ac4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,8 @@ "version": "0.1.0", "license": "BUSL-1.1", "dependencies": { - "@openzeppelin/contracts": "4.9.2", - "@openzeppelin/contracts-upgradeable": "4.9.2" + "@openzeppelin/contracts": "5.0.0", + "@openzeppelin/contracts-upgradeable": "5.0.0" }, "devDependencies": { "@chainsafe/ssz": "0.13.0", @@ -3034,14 +3034,17 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz", - "integrity": "sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.0.0.tgz", + "integrity": "sha512-bv2sdS6LKqVVMLI5+zqnNrNU/CA+6z6CmwFXm/MzmOPBRSO5reEJN7z0Gbzvs0/bv/MZZXNklubpwy3v2+azsw==" }, "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.2.tgz", - "integrity": "sha512-siviV3PZV/fHfPaoIC51rf1Jb6iElkYWnNYZ0leO23/ukXuvOyoC/ahy8jqiV7g+++9Nuo3n/rk5ajSN/+d/Sg==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.0.tgz", + "integrity": "sha512-D54RHzkOKHQ8xUssPgQe2d/U92mwaiBDY7qCCVGq6VqwQjsT3KekEQ3bonev+BLP30oZ0R1U6YC8/oLpizgC5Q==", + "peerDependencies": { + "@openzeppelin/contracts": "5.0.0" + } }, "node_modules/@openzeppelin/defender-admin-client": { "version": "1.48.0", diff --git a/package.json b/package.json index 28abe896..577a331f 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "core" ], "dependencies": { - "@openzeppelin/contracts": "4.9.2", - "@openzeppelin/contracts-upgradeable": "4.9.2" + "@openzeppelin/contracts": "5.0.0", + "@openzeppelin/contracts-upgradeable": "5.0.0" } } diff --git a/test/CumulativeMerkleDrop.spec.ts b/test/CumulativeMerkleDrop.spec.ts index f269ad74..15686e40 100644 --- a/test/CumulativeMerkleDrop.spec.ts +++ b/test/CumulativeMerkleDrop.spec.ts @@ -48,7 +48,7 @@ describe('CumulativeMerkleDrop', () => { it('fails for not owner', async () => { await expect( merkleDrop.connect(sender).setMerkleRoot(tree.root, proofsIpfsHash) - ).revertedWith('Ownable: caller is not the owner') + ).revertedWithCustomError(merkleDrop, 'OwnableUnauthorizedAccount') }) it('works for owner', async () => { diff --git a/test/EthGenesisVault.spec.ts b/test/EthGenesisVault.spec.ts index 7771ed15..aed1bc57 100644 --- a/test/EthGenesisVault.spec.ts +++ b/test/EthGenesisVault.spec.ts @@ -102,8 +102,9 @@ describe('EthGenesisVault', () => { }) it('initializes correctly', async () => { - await expect(vault.connect(admin).initialize(ZERO_BYTES32)).to.revertedWith( - 'Initializable: contract is already initialized' + await expect(vault.connect(admin).initialize(ZERO_BYTES32)).to.revertedWithCustomError( + vault, + 'InvalidInitialization' ) expect(await vault.capacity()).to.be.eq(capacity) diff --git a/test/EthVault.register.spec.ts b/test/EthVault.register.spec.ts index 367a1334..a4cb3cf5 100644 --- a/test/EthVault.register.spec.ts +++ b/test/EthVault.register.spec.ts @@ -361,7 +361,7 @@ describe('EthVault - register', () => { invalidMultiProof.proofFlags, invalidMultiProof.proof ) - ).to.be.revertedWith('MerkleProof: invalid multiproof') + ).to.be.revertedWithCustomError(vault, 'MerkleProofInvalidMultiproof') }) it('fails with invalid indexes', async () => { diff --git a/test/EthVault.state.spec.ts b/test/EthVault.state.spec.ts index 1793d32f..8a283171 100644 --- a/test/EthVault.state.spec.ts +++ b/test/EthVault.state.spec.ts @@ -88,7 +88,7 @@ describe('EthVault - state', () => { unlockedMevReward, }), }) - ).revertedWith("SafeCast: value doesn't fit in 128 bits") + ).revertedWithCustomError(vault, 'SafeCastOverflowedUintDowncast') }) it('reverts when underflow', async () => { diff --git a/test/EthVault.upgrade.spec.ts b/test/EthVault.upgrade.spec.ts index 4dff4005..f1fcca50 100644 --- a/test/EthVault.upgrade.spec.ts +++ b/test/EthVault.upgrade.spec.ts @@ -57,14 +57,6 @@ describe('EthVault - upgrade', () => { ) }) - it('fails without the call', async () => { - await expect(vault.connect(admin).upgradeTo(newImpl)).to.revertedWithCustomError( - vault, - 'UpgradeFailed' - ) - expect(await vault.version()).to.be.eq(1) - }) - it('fails from not admin', async () => { await expect( vault.connect(other).upgradeToAndCall(newImpl, callData) @@ -146,7 +138,7 @@ describe('EthVault - upgrade', () => { newImpl, ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [MAX_UINT256]) ) - ).to.revertedWith('Address: low-level delegate call failed') + ).to.revertedWithCustomError(vault, 'FailedInnerCall') expect(await vault.version()).to.be.eq(1) }) @@ -159,8 +151,9 @@ describe('EthVault - upgrade', () => { await expect( vault.connect(admin).upgradeToAndCall(newImpl, callData) ).to.revertedWithCustomError(vault, 'UpgradeFailed') - await expect(updatedVault.connect(admin).initialize(callData)).to.revertedWith( - 'Initializable: contract is already initialized' + await expect(updatedVault.connect(admin).initialize(callData)).to.revertedWithCustomError( + updatedVault, + 'InvalidInitialization' ) await snapshotGasCost(receipt) }) diff --git a/test/EthVaultFactory.spec.ts b/test/EthVaultFactory.spec.ts index c75ecfe2..adeb60a7 100644 --- a/test/EthVaultFactory.spec.ts +++ b/test/EthVaultFactory.spec.ts @@ -163,8 +163,9 @@ describe('EthVaultFactory', () => { await expect(tx) .to.emit(vaultsRegistry, 'VaultAdded') .withArgs(await factory.getAddress(), vaultAddress) - await expect(vault.connect(admin).initialize(ZERO_BYTES32)).to.revertedWith( - 'Initializable: contract is already initialized' + await expect(vault.connect(admin).initialize(ZERO_BYTES32)).to.revertedWithCustomError( + vault, + 'InvalidInitialization' ) // Factory diff --git a/test/KeeperOracles.spec.ts b/test/KeeperOracles.spec.ts index c631cf7b..1f31ae2b 100644 --- a/test/KeeperOracles.spec.ts +++ b/test/KeeperOracles.spec.ts @@ -21,8 +21,9 @@ describe('KeeperOracles', () => { describe('add oracle', () => { it('fails if not owner', async () => { - await expect(keeper.connect(other).addOracle(oracle.address)).revertedWith( - 'Ownable: caller is not the owner' + await expect(keeper.connect(other).addOracle(oracle.address)).revertedWithCustomError( + keeper, + 'OwnableUnauthorizedAccount' ) }) @@ -61,8 +62,9 @@ describe('KeeperOracles', () => { }) it('fails if not owner', async () => { - await expect(keeper.connect(other).removeOracle(oracle.address)).revertedWith( - 'Ownable: caller is not the owner' + await expect(keeper.connect(other).removeOracle(oracle.address)).revertedWithCustomError( + keeper, + 'OwnableUnauthorizedAccount' ) }) @@ -85,8 +87,9 @@ describe('KeeperOracles', () => { describe('update config', () => { it('fails if not owner', async () => { - await expect(keeper.connect(other).updateConfig(ORACLES_CONFIG)).revertedWith( - 'Ownable: caller is not the owner' + await expect(keeper.connect(other).updateConfig(ORACLES_CONFIG)).revertedWithCustomError( + keeper, + 'OwnableUnauthorizedAccount' ) }) diff --git a/test/KeeperRewards.spec.ts b/test/KeeperRewards.spec.ts index 29e2bcc3..bf43a1ef 100644 --- a/test/KeeperRewards.spec.ts +++ b/test/KeeperRewards.spec.ts @@ -757,8 +757,9 @@ describe('KeeperRewards', () => { describe('set min rewards oracles', () => { it('fails if not owner', async () => { - await expect(keeper.connect(other).setRewardsMinOracles(1)).revertedWith( - 'Ownable: caller is not the owner' + await expect(keeper.connect(other).setRewardsMinOracles(1)).revertedWithCustomError( + keeper, + 'OwnableUnauthorizedAccount' ) }) diff --git a/test/KeeperValidators.spec.ts b/test/KeeperValidators.spec.ts index 014aa1d8..be7e5459 100644 --- a/test/KeeperValidators.spec.ts +++ b/test/KeeperValidators.spec.ts @@ -558,8 +558,9 @@ describe('KeeperValidators', () => { describe('set validators oracles', () => { it('fails if not owner', async () => { - await expect(keeper.connect(sender).setValidatorsMinOracles(1)).revertedWith( - 'Ownable: caller is not the owner' + await expect(keeper.connect(sender).setValidatorsMinOracles(1)).revertedWithCustomError( + keeper, + 'OwnableUnauthorizedAccount' ) }) diff --git a/test/OsToken.spec.ts b/test/OsToken.spec.ts index 6e3bd300..4a17353e 100644 --- a/test/OsToken.spec.ts +++ b/test/OsToken.spec.ts @@ -58,8 +58,9 @@ describe('OsToken', () => { describe('capacity', () => { it('not owner cannot change', async () => { - await expect(osToken.connect(initialHolder).setCapacity(0)).to.be.revertedWith( - 'Ownable: caller is not the owner' + await expect(osToken.connect(initialHolder).setCapacity(0)).to.be.revertedWithCustomError( + osToken, + 'OwnableUnauthorizedAccount' ) }) @@ -73,9 +74,9 @@ describe('OsToken', () => { describe('treasury', () => { it('not owner cannot change', async () => { - await expect(osToken.connect(initialHolder).setTreasury(dao.address)).to.be.revertedWith( - 'Ownable: caller is not the owner' - ) + await expect( + osToken.connect(initialHolder).setTreasury(dao.address) + ).to.be.revertedWithCustomError(osToken, 'OwnableUnauthorizedAccount') }) it('cannot set to zero address', async () => { @@ -95,8 +96,9 @@ describe('OsToken', () => { describe('fee percent', () => { it('not owner cannot change', async () => { - await expect(osToken.connect(initialHolder).setFeePercent(100)).to.be.revertedWith( - 'Ownable: caller is not the owner' + await expect(osToken.connect(initialHolder).setFeePercent(100)).to.be.revertedWithCustomError( + osToken, + 'OwnableUnauthorizedAccount' ) }) @@ -119,9 +121,9 @@ describe('OsToken', () => { describe('checker', () => { it('not owner cannot change', async () => { - await expect(osToken.connect(initialHolder).setChecker(recipient.address)).to.be.revertedWith( - 'Ownable: caller is not the owner' - ) + await expect( + osToken.connect(initialHolder).setChecker(recipient.address) + ).to.be.revertedWithCustomError(osToken, 'OwnableUnauthorizedAccount') }) it('cannot set to zero address', async () => { @@ -141,9 +143,9 @@ describe('OsToken', () => { describe('keeper', () => { it('not owner cannot change', async () => { - await expect(osToken.connect(initialHolder).setKeeper(dao.address)).to.be.revertedWith( - 'Ownable: caller is not the owner' - ) + await expect( + osToken.connect(initialHolder).setKeeper(dao.address) + ).to.be.revertedWithCustomError(osToken, 'OwnableUnauthorizedAccount') }) it('cannot set to zero address', async () => { diff --git a/test/OsTokenConfig.spec.ts b/test/OsTokenConfig.spec.ts index b531795f..e19f9597 100644 --- a/test/OsTokenConfig.spec.ts +++ b/test/OsTokenConfig.spec.ts @@ -39,8 +39,9 @@ describe('OsTokenConfig', () => { }) it('cannot be updated by not owner', async () => { - await expect(osTokenConfig.connect(other).updateConfig(newConfig)).to.revertedWith( - 'Ownable: caller is not the owner' + await expect(osTokenConfig.connect(other).updateConfig(newConfig)).to.revertedWithCustomError( + osTokenConfig, + 'OwnableUnauthorizedAccount' ) }) diff --git a/test/RewardSplitter.spec.ts b/test/RewardSplitter.spec.ts index 29600109..9f8aa927 100644 --- a/test/RewardSplitter.spec.ts +++ b/test/RewardSplitter.spec.ts @@ -65,7 +65,7 @@ describe('RewardSplitter', () => { it('fails by not owner', async () => { await expect( rewardSplitter.connect(other).increaseShares(other.address, 1) - ).to.be.revertedWith('Ownable: caller is not the owner') + ).to.be.revertedWithCustomError(rewardSplitter, 'OwnableUnauthorizedAccount') }) it('fails when vault not harvested', async () => { @@ -161,7 +161,7 @@ describe('RewardSplitter', () => { it('fails by not owner', async () => { await expect( rewardSplitter.connect(other).decreaseShares(other.address, 1) - ).to.be.revertedWith('Ownable: caller is not the owner') + ).to.be.revertedWithCustomError(rewardSplitter, 'OwnableUnauthorizedAccount') }) it('fails with amount larger than balance', async () => { diff --git a/test/VaultsRegistry.spec.ts b/test/VaultsRegistry.spec.ts index d114c16c..7a00138d 100644 --- a/test/VaultsRegistry.spec.ts +++ b/test/VaultsRegistry.spec.ts @@ -72,8 +72,9 @@ describe('VaultsRegistry', () => { }) it('not owner cannot register vault implementation contract', async () => { - await expect(vaultsRegistry.connect(admin).addVaultImpl(newVaultImpl)).revertedWith( - 'Ownable: caller is not the owner' + await expect(vaultsRegistry.connect(admin).addVaultImpl(newVaultImpl)).revertedWithCustomError( + vaultsRegistry, + 'OwnableUnauthorizedAccount' ) }) @@ -94,9 +95,9 @@ describe('VaultsRegistry', () => { it('not owner cannot remove implementation', async () => { await vaultsRegistry.connect(dao).addVaultImpl(newVaultImpl) - await expect(vaultsRegistry.connect(admin).removeVaultImpl(newVaultImpl)).revertedWith( - 'Ownable: caller is not the owner' - ) + await expect( + vaultsRegistry.connect(admin).removeVaultImpl(newVaultImpl) + ).revertedWithCustomError(vaultsRegistry, 'OwnableUnauthorizedAccount') }) it('owner can remove implementation', async () => { @@ -118,7 +119,7 @@ describe('VaultsRegistry', () => { it('not owner cannot add factory', async () => { await expect( vaultsRegistry.connect(admin).addFactory(await ethVaultFactory.getAddress()) - ).revertedWith('Ownable: caller is not the owner') + ).revertedWithCustomError(vaultsRegistry, 'OwnableUnauthorizedAccount') }) it('owner can add factory', async () => { @@ -141,7 +142,7 @@ describe('VaultsRegistry', () => { it('not owner cannot remove factory', async () => { await expect( vaultsRegistry.connect(admin).removeFactory(await ethVaultFactory.getAddress()) - ).revertedWith('Ownable: caller is not the owner') + ).revertedWithCustomError(vaultsRegistry, 'OwnableUnauthorizedAccount') }) it('owner can remove factory', async () => { diff --git a/test/__snapshots__/CumulativeMerkleDrop.spec.ts.snap b/test/__snapshots__/CumulativeMerkleDrop.spec.ts.snap index c8c65cca..5bd1a5f1 100644 --- a/test/__snapshots__/CumulativeMerkleDrop.spec.ts.snap +++ b/test/__snapshots__/CumulativeMerkleDrop.spec.ts.snap @@ -3,7 +3,7 @@ exports[`CumulativeMerkleDrop claim works with valid proof 1`] = ` Object { "calldataByteLength": 228, - "gasUsed": 83971, + "gasUsed": 83813, } `; diff --git a/test/__snapshots__/EthErc20Vault.spec.ts.snap b/test/__snapshots__/EthErc20Vault.spec.ts.snap index 16d6c224..e8d0c1ec 100644 --- a/test/__snapshots__/EthErc20Vault.spec.ts.snap +++ b/test/__snapshots__/EthErc20Vault.spec.ts.snap @@ -3,34 +3,34 @@ exports[`EthErc20Vault deposit emits transfer event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 68948, + "gasUsed": 68918, } `; exports[`EthErc20Vault deposit through receive fallback function emits transfer event 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 76174, + "gasUsed": 76143, } `; exports[`EthErc20Vault enter exit queue emits transfer event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 89124, + "gasUsed": 89078, } `; exports[`EthErc20Vault redeem emits transfer event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 60245, + "gasUsed": 60190, } `; exports[`EthErc20Vault update exit queue emits transfer event 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 137482, + "gasUsed": 137364, } `; diff --git a/test/__snapshots__/EthGenesisVault.spec.ts.snap b/test/__snapshots__/EthGenesisVault.spec.ts.snap index 664071cf..2be43f07 100644 --- a/test/__snapshots__/EthGenesisVault.spec.ts.snap +++ b/test/__snapshots__/EthGenesisVault.spec.ts.snap @@ -3,55 +3,55 @@ exports[`EthGenesisVault can deposit through receive fallback function 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 74456, + "gasUsed": 74444, } `; exports[`EthGenesisVault migrate migrates from rewardEthToken 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 74448, + "gasUsed": 74436, } `; exports[`EthGenesisVault pulls assets on claim exited assets 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 62504, + "gasUsed": 62475, } `; exports[`EthGenesisVault pulls assets on multiple validators registration 1`] = ` Object { "calldataByteLength": 3716, - "gasUsed": 667428, + "gasUsed": 667548, } `; exports[`EthGenesisVault pulls assets on single validator registration 1`] = ` Object { "calldataByteLength": 1444, - "gasUsed": 335764, + "gasUsed": 335898, } `; exports[`EthGenesisVault update state deducts rewards on first state update 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 145172, + "gasUsed": 145157, } `; exports[`EthGenesisVault update state splits penalty between rewardEthToken and vault 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 100572, + "gasUsed": 100555, } `; exports[`EthGenesisVault update state splits reward between rewardEthToken and vault 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 162272, + "gasUsed": 162257, } `; diff --git a/test/__snapshots__/EthPrivErc20Vault.spec.ts.snap b/test/__snapshots__/EthPrivErc20Vault.spec.ts.snap index ec094f99..6d13e382 100644 --- a/test/__snapshots__/EthPrivErc20Vault.spec.ts.snap +++ b/test/__snapshots__/EthPrivErc20Vault.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthPrivErc20Vault deposit can be called by whitelisted user 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 71162, + "gasUsed": 71132, } `; exports[`EthPrivErc20Vault deposit deposit through receive fallback can be called by whitelisted sender 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 78348, + "gasUsed": 78317, } `; diff --git a/test/__snapshots__/EthVault.burn.spec.ts.snap b/test/__snapshots__/EthVault.burn.spec.ts.snap index f6cde6c9..e6736d5d 100644 --- a/test/__snapshots__/EthVault.burn.spec.ts.snap +++ b/test/__snapshots__/EthVault.burn.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - burn burns osTokens 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 97149, + "gasUsed": 97140, } `; exports[`EthVault - burn updates position accumulated fee 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 97149, + "gasUsed": 97140, } `; diff --git a/test/__snapshots__/EthVault.deposit.spec.ts.snap b/test/__snapshots__/EthVault.deposit.spec.ts.snap index be041874..778ca8b0 100644 --- a/test/__snapshots__/EthVault.deposit.spec.ts.snap +++ b/test/__snapshots__/EthVault.deposit.spec.ts.snap @@ -3,27 +3,27 @@ exports[`EthVault - deposit empty vault: no assets & no shares deposit 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 66779, + "gasUsed": 66749, } `; exports[`EthVault - deposit full vault: assets & shares deposit 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 66779, + "gasUsed": 66749, } `; exports[`EthVault - deposit full vault: assets & shares deposit through receive fallback function 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 74346, + "gasUsed": 74315, } `; exports[`EthVault - deposit full vault: assets & shares update state and deposit 1`] = ` Object { "calldataByteLength": 260, - "gasUsed": 207559, + "gasUsed": 207374, } `; diff --git a/test/__snapshots__/EthVault.liquidate.spec.ts.snap b/test/__snapshots__/EthVault.liquidate.spec.ts.snap index 5330ff87..23c8d479 100644 --- a/test/__snapshots__/EthVault.liquidate.spec.ts.snap +++ b/test/__snapshots__/EthVault.liquidate.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - liquidate calculates liquidation correctly 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 109123, + "gasUsed": 109108, } `; exports[`EthVault - liquidate can liquidate 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 111779, + "gasUsed": 111767, } `; diff --git a/test/__snapshots__/EthVault.mint.spec.ts.snap b/test/__snapshots__/EthVault.mint.spec.ts.snap index 176e0aa1..02239d0f 100644 --- a/test/__snapshots__/EthVault.mint.spec.ts.snap +++ b/test/__snapshots__/EthVault.mint.spec.ts.snap @@ -3,20 +3,20 @@ exports[`EthVault - mint mints osTokens to the receiver 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 151791, + "gasUsed": 151745, } `; exports[`EthVault - mint updates position accumulated fee 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 151791, + "gasUsed": 151745, } `; exports[`EthVault - mint updates position accumulated fee 2`] = ` Object { "calldataByteLength": 100, - "gasUsed": 129836, + "gasUsed": 129796, } `; diff --git a/test/__snapshots__/EthVault.multicall.spec.ts.snap b/test/__snapshots__/EthVault.multicall.spec.ts.snap index 9142a154..e38ac036 100644 --- a/test/__snapshots__/EthVault.multicall.spec.ts.snap +++ b/test/__snapshots__/EthVault.multicall.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - multicall can update state and queue for exit 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 164214, + "gasUsed": 164029, } `; exports[`EthVault - multicall can update state and queue for exit 2`] = ` Object { "calldataByteLength": 548, - "gasUsed": 137825, + "gasUsed": 137629, } `; diff --git a/test/__snapshots__/EthVault.redeem.spec.ts.snap b/test/__snapshots__/EthVault.redeem.spec.ts.snap index 58b69533..8280bd51 100644 --- a/test/__snapshots__/EthVault.redeem.spec.ts.snap +++ b/test/__snapshots__/EthVault.redeem.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - redeem osToken calculates redeem correctly 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 120660, + "gasUsed": 120632, } `; exports[`EthVault - redeem osToken can redeem 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 123316, + "gasUsed": 123291, } `; diff --git a/test/__snapshots__/EthVault.register.spec.ts.snap b/test/__snapshots__/EthVault.register.spec.ts.snap index 265e1aa3..e5ca0e99 100644 --- a/test/__snapshots__/EthVault.register.spec.ts.snap +++ b/test/__snapshots__/EthVault.register.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - register multiple validators succeeds 1`] = ` Object { "calldataByteLength": 3652, - "gasUsed": 707990, + "gasUsed": 708101, } `; exports[`EthVault - register single validator succeeds 1`] = ` Object { "calldataByteLength": 1444, - "gasUsed": 357107, + "gasUsed": 357232, } `; diff --git a/test/__snapshots__/EthVault.settings.spec.ts.snap b/test/__snapshots__/EthVault.settings.spec.ts.snap index 1edc22f1..d8186e60 100644 --- a/test/__snapshots__/EthVault.settings.spec.ts.snap +++ b/test/__snapshots__/EthVault.settings.spec.ts.snap @@ -3,27 +3,27 @@ exports[`EthVault - settings fee recipient can update 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 44069, + "gasUsed": 44051, } `; exports[`EthVault - settings keys manager can be updated by admin 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 53054, + "gasUsed": 53014, } `; exports[`EthVault - settings metadata IPFS hash only admin can update 1`] = ` Object { "calldataByteLength": 132, - "gasUsed": 32699, + "gasUsed": 32659, } `; exports[`EthVault - settings validators root can update 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 54960, + "gasUsed": 54920, } `; diff --git a/test/__snapshots__/EthVault.state.spec.ts.snap b/test/__snapshots__/EthVault.state.spec.ts.snap index 49419060..50cc434f 100644 --- a/test/__snapshots__/EthVault.state.spec.ts.snap +++ b/test/__snapshots__/EthVault.state.spec.ts.snap @@ -3,20 +3,20 @@ exports[`EthVault - state allocates fee to recipient when delta is above zero 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 117736, + "gasUsed": 117645, } `; exports[`EthVault - state applies penalty when delta is below zero 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 115319, + "gasUsed": 115226, } `; exports[`EthVault - state updates exit queue 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 144806, + "gasUsed": 144625, } `; diff --git a/test/__snapshots__/EthVault.token.spec.ts.snap b/test/__snapshots__/EthVault.token.spec.ts.snap index 38c0e4b7..995b8813 100644 --- a/test/__snapshots__/EthVault.token.spec.ts.snap +++ b/test/__snapshots__/EthVault.token.spec.ts.snap @@ -3,90 +3,90 @@ exports[`EthVault - token approve decrease allowance when the spender is not the zero address when the sender does not have enough balance when the spender had an approved amount decreases the spender allowance subtracting the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 34824, + "gasUsed": 34784, } `; exports[`EthVault - token approve decrease allowance when the spender is not the zero address when the sender does not have enough balance when the spender had an approved amount emits an approval event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 30024, + "gasUsed": 29984, } `; exports[`EthVault - token approve decrease allowance when the spender is not the zero address when the sender has enough balance when the spender had an approved amount decreases the spender allowance subtracting the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 34824, + "gasUsed": 34784, } `; exports[`EthVault - token approve decrease allowance when the spender is not the zero address when the sender has enough balance when the spender had an approved amount emits an approval event 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 30024, + "gasUsed": 29984, } `; exports[`EthVault - token approve increase allowance when the spender is not the zero address when the sender does not have enough balance when the spender had an approved amount increases the spender allowance adding the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 34252, + "gasUsed": 34212, } `; exports[`EthVault - token approve increase allowance when the spender is not the zero address when the sender does not have enough balance when there was no approved amount before approves the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 51352, + "gasUsed": 51312, } `; exports[`EthVault - token approve when the sender has enough balance when the spender had an approved amount approves the requested amount and replaces the previous one 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 33781, + "gasUsed": 33763, } `; exports[`EthVault - token approve when the sender has enough balance when there was no approved amount before approves the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 50881, + "gasUsed": 50863, } `; exports[`EthVault - token permit accepts owner signature 1`] = ` Object { "calldataByteLength": 228, - "gasUsed": 82523, + "gasUsed": 82505, } `; exports[`EthVault - token transfer from when the spender has enough allowance when the token owner has enough balance transfers the requested amount 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 54838, + "gasUsed": 54820, } `; exports[`EthVault - token transfer from when the spender has unlimited allowance does not decrease the spender allowance 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 61313, + "gasUsed": 61295, } `; exports[`EthVault - token transfer when the sender transfers all balance transfers the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 54587, + "gasUsed": 54547, } `; exports[`EthVault - token transfer when the sender transfers zero tokens transfers the requested amount 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 36663, + "gasUsed": 36623, } `; diff --git a/test/__snapshots__/EthVault.upgrade.spec.ts.snap b/test/__snapshots__/EthVault.upgrade.spec.ts.snap index 3b44a6dc..3f354df3 100644 --- a/test/__snapshots__/EthVault.upgrade.spec.ts.snap +++ b/test/__snapshots__/EthVault.upgrade.spec.ts.snap @@ -3,6 +3,6 @@ exports[`EthVault - upgrade works with valid call data 1`] = ` Object { "calldataByteLength": 132, - "gasUsed": 78465, + "gasUsed": 76105, } `; diff --git a/test/__snapshots__/EthVault.whitelist.spec.ts.snap b/test/__snapshots__/EthVault.whitelist.spec.ts.snap index fbcc941d..5b62b128 100644 --- a/test/__snapshots__/EthVault.whitelist.spec.ts.snap +++ b/test/__snapshots__/EthVault.whitelist.spec.ts.snap @@ -3,34 +3,34 @@ exports[`EthVault - whitelist deposit can be called by whitelisted user 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 68993, + "gasUsed": 68963, } `; exports[`EthVault - whitelist deposit deposit through receive fallback can be called by whitelisted sender 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 76520, + "gasUsed": 76489, } `; exports[`EthVault - whitelist set whitelister admin can update whitelister 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 36253, + "gasUsed": 36235, } `; exports[`EthVault - whitelist whitelist can be updated by whitelister 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 53127, + "gasUsed": 53109, } `; exports[`EthVault - whitelist whitelist can be updated by whitelister 2`] = ` Object { "calldataByteLength": 68, - "gasUsed": 31215, + "gasUsed": 31197, } `; diff --git a/test/__snapshots__/EthVault.withdraw.spec.ts.snap b/test/__snapshots__/EthVault.withdraw.spec.ts.snap index 85568dab..00cf3f35 100644 --- a/test/__snapshots__/EthVault.withdraw.spec.ts.snap +++ b/test/__snapshots__/EthVault.withdraw.spec.ts.snap @@ -3,35 +3,35 @@ exports[`EthVault - withdraw claim exited assets for single user in multiple checkpoints in multiple transactions 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 75054, + "gasUsed": 75016, } `; exports[`EthVault - withdraw claim exited assets for single user in multiple checkpoints in multiple transactions 2`] = ` Object { "calldataByteLength": 100, - "gasUsed": 48067, + "gasUsed": 48036, } `; exports[`EthVault - withdraw claim exited assets for single user in multiple checkpoints in single transaction 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 50494, + "gasUsed": 50456, } `; exports[`EthVault - withdraw claim exited assets for single user in single checkpoint 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 48067, + "gasUsed": 48036, } `; exports[`EthVault - withdraw enter exit queue locks shares for the time of exit 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 87112, + "gasUsed": 87066, } `; @@ -40,20 +40,20 @@ exports[`EthVault - withdraw get checkpoint index works with many checkpoints 1` exports[`EthVault - withdraw redeem redeem transfers assets to receiver 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 58242, + "gasUsed": 58187, } `; exports[`EthVault - withdraw update exit queue adds checkpoint 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 103416, + "gasUsed": 103290, } `; exports[`EthVault - withdraw update exit queue for not all the queued shares 1`] = ` Object { "calldataByteLength": 196, - "gasUsed": 103412, + "gasUsed": 103286, } `; diff --git a/test/__snapshots__/EthVaultFactory.spec.ts.snap b/test/__snapshots__/EthVaultFactory.spec.ts.snap index 790e289a..27722fb7 100644 --- a/test/__snapshots__/EthVaultFactory.spec.ts.snap +++ b/test/__snapshots__/EthVaultFactory.spec.ts.snap @@ -3,55 +3,55 @@ exports[`EthVaultFactory EthErc20Vault private vault deployment with own escrow gas 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 620898, + "gasUsed": 606661, } `; exports[`EthVaultFactory EthErc20Vault private vault deployment with shared escrow gas 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 468265, + "gasUsed": 454028, } `; exports[`EthVaultFactory EthErc20Vault public vault deployment with own escrow gas 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 572729, + "gasUsed": 558459, } `; exports[`EthVaultFactory EthErc20Vault public vault deployment with shared escrow gas 1`] = ` Object { "calldataByteLength": 516, - "gasUsed": 420096, + "gasUsed": 405826, } `; exports[`EthVaultFactory EthVault private vault deployment with own escrow gas 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 546984, + "gasUsed": 532521, } `; exports[`EthVaultFactory EthVault private vault deployment with shared escrow gas 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 394351, + "gasUsed": 379888, } `; exports[`EthVaultFactory EthVault public vault deployment with own escrow gas 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 498812, + "gasUsed": 484316, } `; exports[`EthVaultFactory EthVault public vault deployment with shared escrow gas 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 346179, + "gasUsed": 331683, } `; diff --git a/test/__snapshots__/KeeperRewards.spec.ts.snap b/test/__snapshots__/KeeperRewards.spec.ts.snap index 02221fa2..a2dd5aed 100644 --- a/test/__snapshots__/KeeperRewards.spec.ts.snap +++ b/test/__snapshots__/KeeperRewards.spec.ts.snap @@ -3,42 +3,42 @@ exports[`KeeperRewards harvest (own escrow) succeeds for latest rewards root 1`] = ` Object { "calldataByteLength": 292, - "gasUsed": 110874, + "gasUsed": 110823, } `; exports[`KeeperRewards harvest (own escrow) succeeds for previous rewards root 1`] = ` Object { "calldataByteLength": 292, - "gasUsed": 113029, + "gasUsed": 112978, } `; exports[`KeeperRewards harvest (own escrow) succeeds for previous rewards root 2`] = ` Object { "calldataByteLength": 196, - "gasUsed": 74427, + "gasUsed": 74376, } `; exports[`KeeperRewards harvest (shared escrow) succeeds for latest rewards root 1`] = ` Object { "calldataByteLength": 292, - "gasUsed": 144187, + "gasUsed": 144096, } `; exports[`KeeperRewards harvest (shared escrow) succeeds for previous rewards root 1`] = ` Object { "calldataByteLength": 292, - "gasUsed": 146342, + "gasUsed": 146251, } `; exports[`KeeperRewards harvest (shared escrow) succeeds for previous rewards root 2`] = ` Object { "calldataByteLength": 196, - "gasUsed": 90652, + "gasUsed": 90561, } `; @@ -52,20 +52,20 @@ Object { exports[`KeeperRewards update rewards succeeds 1`] = ` Object { "calldataByteLength": 772, - "gasUsed": 140923, + "gasUsed": 141004, } `; exports[`KeeperRewards update rewards succeeds 2`] = ` Object { "calldataByteLength": 772, - "gasUsed": 123739, + "gasUsed": 123820, } `; exports[`KeeperRewards update rewards succeeds with all signatures 1`] = ` Object { "calldataByteLength": 1156, - "gasUsed": 147115, + "gasUsed": 147196, } `; diff --git a/test/__snapshots__/KeeperValidators.spec.ts.snap b/test/__snapshots__/KeeperValidators.spec.ts.snap index 475d6b2e..14e94bd3 100644 --- a/test/__snapshots__/KeeperValidators.spec.ts.snap +++ b/test/__snapshots__/KeeperValidators.spec.ts.snap @@ -3,28 +3,28 @@ exports[`KeeperValidators register multiple validators succeeds 1`] = ` Object { "calldataByteLength": 3716, - "gasUsed": 709045, + "gasUsed": 709156, } `; exports[`KeeperValidators register multiple validators succeeds 2`] = ` Object { "calldataByteLength": 3716, - "gasUsed": 617474, + "gasUsed": 617585, } `; exports[`KeeperValidators register single validator succeeds 1`] = ` Object { "calldataByteLength": 1508, - "gasUsed": 358167, + "gasUsed": 358292, } `; exports[`KeeperValidators register single validator succeeds 2`] = ` Object { "calldataByteLength": 1540, - "gasUsed": 305547, + "gasUsed": 305672, } `; diff --git a/test/__snapshots__/OsToken.spec.ts.snap b/test/__snapshots__/OsToken.spec.ts.snap index 139e714a..13f26907 100644 --- a/test/__snapshots__/OsToken.spec.ts.snap +++ b/test/__snapshots__/OsToken.spec.ts.snap @@ -73,7 +73,7 @@ Object { exports[`OsToken fee percent owner can change 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 69118, + "gasUsed": 69124, } `; diff --git a/test/__snapshots__/OsTokenConfig.spec.ts.snap b/test/__snapshots__/OsTokenConfig.spec.ts.snap index 0762b7f8..cf64c04f 100644 --- a/test/__snapshots__/OsTokenConfig.spec.ts.snap +++ b/test/__snapshots__/OsTokenConfig.spec.ts.snap @@ -3,6 +3,6 @@ exports[`OsTokenConfig owner can update config 1`] = ` Object { "calldataByteLength": 164, - "gasUsed": 32429, + "gasUsed": 32432, } `; diff --git a/test/__snapshots__/RewardSplitter.spec.ts.snap b/test/__snapshots__/RewardSplitter.spec.ts.snap index 33a91294..abd69856 100644 --- a/test/__snapshots__/RewardSplitter.spec.ts.snap +++ b/test/__snapshots__/RewardSplitter.spec.ts.snap @@ -3,34 +3,34 @@ exports[`RewardSplitter decrease shares owner can decrease shares 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 67163, + "gasUsed": 67138, } `; exports[`RewardSplitter increase shares owner can increase shares 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 78763, + "gasUsed": 78775, } `; exports[`RewardSplitter sync rewards anyone can sync rewards 1`] = ` Object { "calldataByteLength": 4, - "gasUsed": 73195, + "gasUsed": 73158, } `; exports[`RewardSplitter withdraw rewards can claim vault tokens for ERC-20 vault 1`] = ` Object { "calldataByteLength": 68, - "gasUsed": 78437, + "gasUsed": 78303, } `; exports[`RewardSplitter withdraw rewards can enter exit queue with multicall 1`] = ` Object { "calldataByteLength": 612, - "gasUsed": 168827, + "gasUsed": 168714, } `; diff --git a/test/__snapshots__/RewardSplitterFactory.spec.ts.snap b/test/__snapshots__/RewardSplitterFactory.spec.ts.snap index 018a8c69..b320aa13 100644 --- a/test/__snapshots__/RewardSplitterFactory.spec.ts.snap +++ b/test/__snapshots__/RewardSplitterFactory.spec.ts.snap @@ -3,6 +3,6 @@ exports[`RewardSplitterFactory splitter deployment gas 1`] = ` Object { "calldataByteLength": 36, - "gasUsed": 137552, + "gasUsed": 138099, } `; diff --git a/test/__snapshots__/VaultsRegistry.spec.ts.snap b/test/__snapshots__/VaultsRegistry.spec.ts.snap index b1243ca6..e0e96f8a 100644 --- a/test/__snapshots__/VaultsRegistry.spec.ts.snap +++ b/test/__snapshots__/VaultsRegistry.spec.ts.snap @@ -3,7 +3,7 @@ exports[`VaultsRegistry factory can add vault 1`] = ` Object { "calldataByteLength": 324, - "gasUsed": 346179, + "gasUsed": 331683, } `; From 66084b8ebf673ce335578e764e05f6c798dfde0f Mon Sep 17 00:00:00 2001 From: Dmitri Tsumak Date: Wed, 11 Oct 2023 16:47:20 +0300 Subject: [PATCH 12/12] Add burned shares to event --- abi/IEthErc20Vault.json | 30 +++++++------- abi/IEthGenesisVault.json | 30 +++++++------- abi/IEthPrivErc20Vault.json | 30 +++++++------- abi/IEthPrivVault.json | 30 +++++++------- abi/IEthVault.json | 30 +++++++------- abi/IVaultOsToken.json | 30 +++++++------- contracts/interfaces/IVaultOsToken.sol | 24 +++++------ contracts/vaults/modules/VaultOsToken.sol | 40 +++++++++++++------ test/EthVault.liquidate.spec.ts | 9 ++++- test/EthVault.redeem.spec.ts | 9 ++++- test/KeeperValidators.spec.ts | 8 ++-- .../EthVault.liquidate.spec.ts.snap | 4 +- .../EthVault.redeem.spec.ts.snap | 4 +- .../__snapshots__/EthVault.token.spec.ts.snap | 2 +- 14 files changed, 151 insertions(+), 129 deletions(-) diff --git a/abi/IEthErc20Vault.json b/abi/IEthErc20Vault.json index 02df03b2..9533dcc8 100644 --- a/abi/IEthErc20Vault.json +++ b/abi/IEthErc20Vault.json @@ -273,7 +273,13 @@ { "indexed": false, "internalType": "uint256", - "name": "coveredShares", + "name": "osTokenShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", "type": "uint256" }, { @@ -344,6 +350,12 @@ "name": "receiver", "type": "address" }, + { + "indexed": false, + "internalType": "uint256", + "name": "osTokenShares", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -938,13 +950,7 @@ } ], "name": "liquidateOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -1179,13 +1185,7 @@ } ], "name": "redeemOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, diff --git a/abi/IEthGenesisVault.json b/abi/IEthGenesisVault.json index bb1f6261..1138e1bd 100644 --- a/abi/IEthGenesisVault.json +++ b/abi/IEthGenesisVault.json @@ -304,7 +304,13 @@ { "indexed": false, "internalType": "uint256", - "name": "coveredShares", + "name": "osTokenShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", "type": "uint256" }, { @@ -375,6 +381,12 @@ "name": "receiver", "type": "address" }, + { + "indexed": false, + "internalType": "uint256", + "name": "osTokenShares", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -810,13 +822,7 @@ } ], "name": "liquidateOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -1000,13 +1006,7 @@ } ], "name": "redeemOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, diff --git a/abi/IEthPrivErc20Vault.json b/abi/IEthPrivErc20Vault.json index de6b4d4c..8da89895 100644 --- a/abi/IEthPrivErc20Vault.json +++ b/abi/IEthPrivErc20Vault.json @@ -273,7 +273,13 @@ { "indexed": false, "internalType": "uint256", - "name": "coveredShares", + "name": "osTokenShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", "type": "uint256" }, { @@ -344,6 +350,12 @@ "name": "receiver", "type": "address" }, + { + "indexed": false, + "internalType": "uint256", + "name": "osTokenShares", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -982,13 +994,7 @@ } ], "name": "liquidateOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -1223,13 +1229,7 @@ } ], "name": "redeemOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, diff --git a/abi/IEthPrivVault.json b/abi/IEthPrivVault.json index b789fbad..9a230124 100644 --- a/abi/IEthPrivVault.json +++ b/abi/IEthPrivVault.json @@ -248,7 +248,13 @@ { "indexed": false, "internalType": "uint256", - "name": "coveredShares", + "name": "osTokenShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", "type": "uint256" }, { @@ -319,6 +325,12 @@ "name": "receiver", "type": "address" }, + { + "indexed": false, + "internalType": "uint256", + "name": "osTokenShares", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -791,13 +803,7 @@ } ], "name": "liquidateOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -957,13 +963,7 @@ } ], "name": "redeemOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, diff --git a/abi/IEthVault.json b/abi/IEthVault.json index bff98d76..f32b55ed 100644 --- a/abi/IEthVault.json +++ b/abi/IEthVault.json @@ -248,7 +248,13 @@ { "indexed": false, "internalType": "uint256", - "name": "coveredShares", + "name": "osTokenShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", "type": "uint256" }, { @@ -319,6 +325,12 @@ "name": "receiver", "type": "address" }, + { + "indexed": false, + "internalType": "uint256", + "name": "osTokenShares", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -747,13 +759,7 @@ } ], "name": "liquidateOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -913,13 +919,7 @@ } ], "name": "redeemOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, diff --git a/abi/IVaultOsToken.json b/abi/IVaultOsToken.json index d8c382d6..81f5fb69 100644 --- a/abi/IVaultOsToken.json +++ b/abi/IVaultOsToken.json @@ -229,7 +229,13 @@ { "indexed": false, "internalType": "uint256", - "name": "coveredShares", + "name": "osTokenShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "shares", "type": "uint256" }, { @@ -300,6 +306,12 @@ "name": "receiver", "type": "address" }, + { + "indexed": false, + "internalType": "uint256", + "name": "osTokenShares", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -633,13 +645,7 @@ } ], "name": "liquidateOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -747,13 +753,7 @@ } ], "name": "redeemOsToken", - "outputs": [ - { - "internalType": "uint256", - "name": "receivedAssets", - "type": "uint256" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, diff --git a/contracts/interfaces/IVaultOsToken.sol b/contracts/interfaces/IVaultOsToken.sol index 1c364bd2..d8fca7ee 100644 --- a/contracts/interfaces/IVaultOsToken.sol +++ b/contracts/interfaces/IVaultOsToken.sol @@ -40,14 +40,16 @@ interface IVaultOsToken is IVaultState, IVaultEnterExit { * @param caller The address of the function caller * @param user The address of the user liquidated * @param receiver The address of the receiver of the liquidated assets - * @param coveredShares The amount of covered shares + * @param osTokenShares The amount of osToken shares to liquidate + * @param shares The amount of vault shares burned * @param receivedAssets The amount of assets received */ event OsTokenLiquidated( address indexed caller, address indexed user, address receiver, - uint256 coveredShares, + uint256 osTokenShares, + uint256 shares, uint256 receivedAssets ); @@ -56,13 +58,15 @@ interface IVaultOsToken is IVaultState, IVaultEnterExit { * @param caller The address of the function caller * @param user The address of the position owner to redeem from * @param receiver The address of the receiver of the redeemed assets - * @param shares The amount of shares to redeem + * @param osTokenShares The amount of osToken shares to redeem + * @param shares The amount of vault shares burned * @param assets The amount of assets received */ event OsTokenRedeemed( address indexed caller, address indexed user, address receiver, + uint256 osTokenShares, uint256 shares, uint256 assets ); @@ -110,24 +114,14 @@ interface IVaultOsToken is IVaultState, IVaultEnterExit { * @param osTokenShares The number of shares to cover * @param owner The address of the position owner to liquidate * @param receiver The address of the receiver of the liquidated assets - * @return receivedAssets The number of assets received */ - function liquidateOsToken( - uint256 osTokenShares, - address owner, - address receiver - ) external returns (uint256 receivedAssets); + function liquidateOsToken(uint256 osTokenShares, address owner, address receiver) external; /** * @notice Redeems osToken shares for assets. Can only be called when health factor is above redeemFromHealthFactor. * @param osTokenShares The number of osToken shares to redeem * @param owner The address of the position owner to redeem from * @param receiver The address of the receiver of the redeemed assets - * @return receivedAssets The number of assets received */ - function redeemOsToken( - uint256 osTokenShares, - address owner, - address receiver - ) external returns (uint256 receivedAssets); + function redeemOsToken(uint256 osTokenShares, address owner, address receiver) external; } diff --git a/contracts/vaults/modules/VaultOsToken.sol b/contracts/vaults/modules/VaultOsToken.sol index 34eb2fd8..edfc9b72 100644 --- a/contracts/vaults/modules/VaultOsToken.sol +++ b/contracts/vaults/modules/VaultOsToken.sol @@ -116,19 +116,32 @@ abstract contract VaultOsToken is VaultImmutables, VaultState, VaultEnterExit, I uint256 osTokenShares, address owner, address receiver - ) external override returns (uint256 receivedAssets) { - receivedAssets = _redeemOsToken(owner, receiver, osTokenShares, true); - emit OsTokenLiquidated(msg.sender, owner, receiver, osTokenShares, receivedAssets); + ) external override { + (uint256 burnedShares, uint256 receivedAssets) = _redeemOsToken( + owner, + receiver, + osTokenShares, + true + ); + emit OsTokenLiquidated( + msg.sender, + owner, + receiver, + osTokenShares, + burnedShares, + receivedAssets + ); } /// @inheritdoc IVaultOsToken - function redeemOsToken( - uint256 osTokenShares, - address owner, - address receiver - ) external override returns (uint256 receivedAssets) { - receivedAssets = _redeemOsToken(owner, receiver, osTokenShares, false); - emit OsTokenRedeemed(msg.sender, owner, receiver, osTokenShares, receivedAssets); + function redeemOsToken(uint256 osTokenShares, address owner, address receiver) external override { + (uint256 burnedShares, uint256 receivedAssets) = _redeemOsToken( + owner, + receiver, + osTokenShares, + false + ); + emit OsTokenRedeemed(msg.sender, owner, receiver, osTokenShares, burnedShares, receivedAssets); } /// @inheritdoc IVaultEnterExit @@ -155,6 +168,7 @@ abstract contract VaultOsToken is VaultImmutables, VaultState, VaultEnterExit, I * @param receiver The receiver of the assets * @param osTokenShares The amount of osToken shares to redeem or liquidate * @param isLiquidation Whether the liquidation or redemption is being performed + * @return burnedShares The amount of shares burned * @return receivedAssets The amount of assets received */ function _redeemOsToken( @@ -162,7 +176,7 @@ abstract contract VaultOsToken is VaultImmutables, VaultState, VaultEnterExit, I address receiver, uint256 osTokenShares, bool isLiquidation - ) private returns (uint256 receivedAssets) { + ) private returns (uint256 burnedShares, uint256 receivedAssets) { if (receiver == address(0)) revert Errors.ZeroAddress(); _checkHarvested(); @@ -225,7 +239,7 @@ abstract contract VaultOsToken is VaultImmutables, VaultState, VaultEnterExit, I position.shares -= SafeCast.toUint128(osTokenShares); _positions[owner] = position; - uint256 sharesToBurn = convertToShares(receivedAssets); + burnedShares = convertToShares(receivedAssets); // update total assets unchecked { @@ -233,7 +247,7 @@ abstract contract VaultOsToken is VaultImmutables, VaultState, VaultEnterExit, I } // burn owner shares - _burnShares(owner, sharesToBurn); + _burnShares(owner, burnedShares); // check ltv violation in case of redemption if ( diff --git a/test/EthVault.liquidate.spec.ts b/test/EthVault.liquidate.spec.ts index 509cd75d..45cbb2cb 100644 --- a/test/EthVault.liquidate.spec.ts +++ b/test/EthVault.liquidate.spec.ts @@ -166,7 +166,14 @@ describe('EthVault - liquidate', () => { await expect(receipt) .to.emit(vault, 'OsTokenLiquidated') - .withArgs(liquidator.address, owner.address, receiver.address, osTokenShares, osTokenAssets) + .withArgs( + liquidator.address, + owner.address, + receiver.address, + osTokenShares, + burnedShares, + osTokenAssets + ) await expect(receipt) .to.emit(osToken, 'Transfer') .withArgs(liquidator.address, ZERO_ADDRESS, osTokenShares) diff --git a/test/EthVault.redeem.spec.ts b/test/EthVault.redeem.spec.ts index 8088226f..72660193 100644 --- a/test/EthVault.redeem.spec.ts +++ b/test/EthVault.redeem.spec.ts @@ -163,7 +163,14 @@ describe('EthVault - redeem osToken', () => { await expect(receipt) .to.emit(vault, 'OsTokenRedeemed') - .withArgs(redeemer.address, owner.address, receiver.address, redeemedShares, redeemedAssets) + .withArgs( + redeemer.address, + owner.address, + receiver.address, + redeemedShares, + burnedShares, + redeemedAssets + ) await expect(receipt) .to.emit(osToken, 'Transfer') .withArgs(redeemer.address, ZERO_ADDRESS, redeemedShares) diff --git a/test/KeeperValidators.spec.ts b/test/KeeperValidators.spec.ts index be7e5459..4ef966c0 100644 --- a/test/KeeperValidators.spec.ts +++ b/test/KeeperValidators.spec.ts @@ -24,7 +24,7 @@ import { } from './shared/validators' import snapshotGasCost from './shared/snapshotGasCost' import { collateralizeEthVault } from './shared/rewards' -import { toHexString } from './shared/utils' +import { getLatestBlockTimestamp, toHexString } from './shared/utils' describe('KeeperValidators', () => { const capacity = ethers.parseEther('1000') @@ -136,7 +136,7 @@ describe('KeeperValidators', () => { vault.registerValidator( { ...approveParams, - deadline: Math.floor(Date.now() / 1000) - 1, + deadline: await getLatestBlockTimestamp(), }, proof ) @@ -327,7 +327,7 @@ describe('KeeperValidators', () => { vault.registerValidators( { ...approveParams, - deadline: Math.floor(Date.now() / 1000) - 1, + deadline: await getLatestBlockTimestamp(), }, indexes, proof.proofFlags, @@ -498,7 +498,7 @@ describe('KeeperValidators', () => { it('fails for expired deadline', async () => { await collateralizeEthVault(vault, keeper, validatorsRegistry, admin) - const newDeadline = Math.floor(Date.now() / 1000) + const newDeadline = await getLatestBlockTimestamp() const newSigningData = await getEthValidatorsExitSignaturesSigningData( keeper, vault, diff --git a/test/__snapshots__/EthVault.liquidate.spec.ts.snap b/test/__snapshots__/EthVault.liquidate.spec.ts.snap index 23c8d479..801dc817 100644 --- a/test/__snapshots__/EthVault.liquidate.spec.ts.snap +++ b/test/__snapshots__/EthVault.liquidate.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - liquidate calculates liquidation correctly 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 109108, + "gasUsed": 109434, } `; exports[`EthVault - liquidate can liquidate 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 111767, + "gasUsed": 112093, } `; diff --git a/test/__snapshots__/EthVault.redeem.spec.ts.snap b/test/__snapshots__/EthVault.redeem.spec.ts.snap index 8280bd51..29edf8d2 100644 --- a/test/__snapshots__/EthVault.redeem.spec.ts.snap +++ b/test/__snapshots__/EthVault.redeem.spec.ts.snap @@ -3,13 +3,13 @@ exports[`EthVault - redeem osToken calculates redeem correctly 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 120632, + "gasUsed": 120995, } `; exports[`EthVault - redeem osToken can redeem 1`] = ` Object { "calldataByteLength": 100, - "gasUsed": 123291, + "gasUsed": 123654, } `; diff --git a/test/__snapshots__/EthVault.token.spec.ts.snap b/test/__snapshots__/EthVault.token.spec.ts.snap index 995b8813..e84d8b3e 100644 --- a/test/__snapshots__/EthVault.token.spec.ts.snap +++ b/test/__snapshots__/EthVault.token.spec.ts.snap @@ -59,7 +59,7 @@ Object { exports[`EthVault - token permit accepts owner signature 1`] = ` Object { "calldataByteLength": 228, - "gasUsed": 82505, + "gasUsed": 82529, } `;